[{"data":1,"prerenderedAt":3958},["ShallowReactive",2],{"search-docs":3,"doc-\u002Fai\u002Ffundamentals\u002Fneural-networks":886},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,159,162,165,169,172,175,178,182,186,190,194,198,202,206,210,214,218,222,226,230,234,238,242,246,250,254,258,262,266,269,273,277,281,285,288,291,294,298,301,304,307,310,313,316,319,322,325,329,332,336,340,344,348,352,356,359,362,365,368,371,374,377,380,383,386,389,393,396,399,402,405,408,411,414,417,420,424,428,432,435,438,442,446,450,454,458,462,466,470,474,477,480,483,487,491,494,497,500,504,507,511,515,518,521,524,527,530,533,536,539,542,545,548,551,554,557,560,563,566,569,572,575,579,583,587,591,595,599,603,606,610,614,617,620,623,626,629,633,637,640,643,646,649,652,655,658,661,664,667,670,673,676,679,682,685,688,691,694,697,700,703,706,709,712,716,720,724,728,732,736,740,744,748,752,756,760,764,768,772,775,779,783,787,790,793,796,799,802,805,808,811,814,818,822,825,829,832,835,838,841,844,848,851,854,858,862,865,869,873,876,879,882],{"path":5,"title":6,"description":7},"\u002Fabout\u002Fauthor","作者相关","只想纯粹的做一个程序员...",{"path":9,"title":10,"description":11},"\u002Fabout\u002Fjourney","心路历程","",{"path":13,"title":14,"description":15},"\u002Fai\u002Fagent\u002Fframeworks","Agent 框架","主流 Agent 框架：LangChain、LlamaIndex、AutoGen、CrewAI",{"path":17,"title":18,"description":19},"\u002Fai\u002Fagent\u002Fhooks","Agent Hooks 与自动化","Claude Agent 的 Hooks 生命周期、事件类型、典型自动化场景",{"path":21,"title":22,"description":23},"\u002Fai\u002Fagent\u002Fintroduction","AI Agent 概述","AI Agent 核心概念：感知、规划、执行、记忆",{"path":25,"title":26,"description":27},"\u002Fai\u002Fagent\u002Fpractice","Agent 实战","AI Agent 实战：构建自主任务执行系统",{"path":29,"title":30,"description":31},"\u002Fai\u002Fagent\u002Fsdk","Claude Agent SDK 开发","使用 Claude Agent SDK 构建自定义 AI Agent：架构、API、生命周期",{"path":33,"title":34,"description":35},"\u002Fai\u002Fagent\u002Fsubagents","Subagents 子代理","用 Subagents 分解复杂任务、并发执行、隔离上下文",{"path":37,"title":38,"description":39},"\u002Fai\u002Fagent\u002Ftool-use","工具调用","AI Agent 工具调用：Function Calling、Tool Use 原理与实践",{"path":41,"title":42,"description":43},"\u002Fai\u002Ffundamentals\u002Fdeep-learning","深度学习入门","深度学习基础知识：前向传播、反向传播、损失函数、优化器",{"path":45,"title":46,"description":47},"\u002Fai\u002Ffundamentals\u002Fml-basics","机器学习基础","机器学习核心概念：监督学习、无监督学习、强化学习",{"path":49,"title":50,"description":51},"\u002Fai\u002Ffundamentals\u002Fneural-networks","神经网络原理","神经网络架构：CNN、RNN、注意力机制",{"path":53,"title":54,"description":55},"\u002Fai\u002Fgetting-started","AI 学习路线","AI 技术学习路线图，从基础到实战的完整指南",{"path":57,"title":58,"description":59},"\u002Fai\u002Fllm\u002Ffine-tuning","模型微调","大模型微调技术：LoRA、QLoRA、全量微调、RLHF",{"path":61,"title":62,"description":63},"\u002Fai\u002Fllm\u002Fintroduction","大模型概述","大语言模型发展历程、核心能力与主流模型对比",{"path":65,"title":66,"description":67},"\u002Fai\u002Fllm\u002Flocal-deploy","本地部署","大模型本地部署：Ollama、vLLM、llama.cpp",{"path":69,"title":70,"description":71},"\u002Fai\u002Fllm\u002Ftransformer","Transformer 架构","Transformer 架构详解：自注意力机制、位置编码、多头注意力",{"path":73,"title":74,"description":75},"\u002Fai\u002Fmcp\u002Fclient","MCP Client 开发","MCP Client 开发指南：连接、调用、集成",{"path":77,"title":78,"description":79},"\u002Fai\u002Fmcp\u002Fdebugging","MCP 调试与排错","MCP Server 开发与集成过程中的常见问题、日志分析、诊断工具",{"path":81,"title":82,"description":83},"\u002Fai\u002Fmcp\u002Fintroduction","MCP 概述","Model Context Protocol 协议概述：架构、核心概念、应用场景",{"path":85,"title":86,"description":87},"\u002Fai\u002Fmcp\u002Fserver","MCP Server 开发","MCP Server 开发指南：资源、工具、提示词的实现",{"path":89,"title":90,"description":91},"\u002Fai\u002Fmcp\u002Ftools","MCP Tools 深入","深入理解 MCP Tools：与 Resources\u002FPrompts 的差异、Schema 设计、Annotations 与权限控制",{"path":93,"title":94,"description":95},"\u002Fai\u002Fprompt\u002Fadvanced","高级 Prompt 模式","高级 Prompt 设计模式：Tree-of-Thought、自我反思、多轮对话策略",{"path":97,"title":98,"description":99},"\u002Fai\u002Fprompt\u002Fbasics","Prompt 基础","Prompt Engineering 入门：基本概念、角色设定、输出格式控制",{"path":101,"title":102,"description":103},"\u002Fai\u002Fprompt\u002Ftechniques","提示词技巧","常用提示词技巧：Few-shot、Chain-of-Thought、ReAct",{"path":105,"title":106,"description":107},"\u002Fai\u002Frag\u002Fembedding","文本嵌入","文本嵌入模型：Embedding 原理、模型选择、相似度计算",{"path":109,"title":110,"description":111},"\u002Fai\u002Frag\u002Fintroduction","RAG 概述","检索增强生成（RAG）架构原理、优势与应用场景",{"path":113,"title":114,"description":115},"\u002Fai\u002Frag\u002Fpractice","RAG 实战","RAG 应用实战：文档问答系统、知识库搭建",{"path":117,"title":118,"description":119},"\u002Fai\u002Frag\u002Fvector-database","向量数据库","主流向量数据库对比：Milvus、Pinecone、Chroma、Weaviate",{"path":121,"title":122,"description":123},"\u002Fai\u002Fskills\u002Fbest-practices","Skill 最佳实践","编写高质量 Skill 的设计原则、常见陷阱与优化技巧",{"path":125,"title":126,"description":127},"\u002Fai\u002Fskills\u002Fcreating","创建自定义 Skill","从零编写一个可被 Agent 自动发现和调用的 Skill",{"path":129,"title":130,"description":131},"\u002Fai\u002Fskills\u002Fintroduction","Agent Skills 概述","Claude Agent Skills 概念、工作原理、与 Tools\u002FMCP 的区别",{"path":133,"title":134,"description":135},"\u002Fgolang\u002Fadvanced\u002Fconcurrency","Go - 并发深入","深入理解 Go 并发编程的核心机制。",{"path":137,"title":138,"description":139},"\u002Fgolang\u002Fadvanced\u002Fgc","Go - 垃圾回收","理解 Go 的垃圾回收机制，掌握 GC 调优方法。",{"path":141,"title":142,"description":143},"\u002Fgolang\u002Fadvanced\u002Fgmp","Go - GMP 调度模型","GMP 是 Go 运行时调度器的核心模型，理解它对于编写高性能 Go 程序至关重要。",{"path":145,"title":146,"description":147},"\u002Fgolang\u002Fadvanced\u002Fgo-concurrency","Go - 并发编程","Go 的并发是其核心特性之一，通过 Goroutine 和 Channel 实现。",{"path":149,"title":150,"description":151},"\u002Fgolang\u002Fadvanced\u002Fmemory","Go - 内存模型","理解 Go 的内存分配机制和内存模型。",{"path":153,"title":154,"description":155},"\u002Fgolang\u002Fadvanced\u002Fprofiling","Go - 性能分析","掌握 Go 的性能分析工具：pprof、trace、benchmark。",{"path":157,"title":158,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-basic","Go - 基础语法",{"path":160,"title":161,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-composite","Go - 复合类型",{"path":163,"title":164,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-control","Go - 流程控制",{"path":166,"title":167,"description":168},"\u002Fgolang\u002Fcore\u002Fgo-error","Go - 错误处理","Go 使用显式的错误返回值来处理错误，而不是异常机制。",{"path":170,"title":171,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-function","Go - 函数",{"path":173,"title":174,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-install","Go - 环境搭建",{"path":176,"title":177,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-interface","Go - 接口",{"path":179,"title":180,"description":181},"\u002Fgolang\u002Fcore\u002Fgo-module","Go - 包管理","Go Modules 是 Go 1.11 引入的官方依赖管理方案，Go 1.16 后成为默认模式。",{"path":183,"title":184,"description":185},"\u002Fgolang\u002Fdistributed\u002Fgrpc","Go - gRPC","gRPC 是 Google 开发的高性能 RPC 框架，使用 Protocol Buffers 作为序列化协议。",{"path":187,"title":188,"description":189},"\u002Fgolang\u002Fdistributed\u002Fmicroservice","Go - 微服务","微服务架构的核心组件：服务发现、负载均衡、熔断降级。",{"path":191,"title":192,"description":193},"\u002Fgolang\u002Fdistributed\u002Fmq","Go - 消息队列","使用 Go 操作 Kafka 和 RabbitMQ。",{"path":195,"title":196,"description":197},"\u002Fgolang\u002Fdistributed\u002Fredis","Go - Redis","使用 go-redis 操作 Redis，实现缓存、分布式锁等功能。",{"path":199,"title":200,"description":201},"\u002Fgolang\u002Fengineering\u002Fconfig","Go - 配置管理","使用 viper 进行配置管理，支持多种配置格式和配置中心。",{"path":203,"title":204,"description":205},"\u002Fgolang\u002Fengineering\u002Fdocker","Go - Docker 部署","使用 Docker 容器化部署 Go 应用。",{"path":207,"title":208,"description":209},"\u002Fgolang\u002Fengineering\u002Fkubernetes","Go - Kubernetes 部署","在 Kubernetes 上部署和管理 Go 应用。",{"path":211,"title":212,"description":213},"\u002Fgolang\u002Fengineering\u002Flogging","Go - 日志系统","使用 zap 和 logrus 构建高性能结构化日志系统。",{"path":215,"title":216,"description":217},"\u002Fgolang\u002Fengineering\u002Ftesting","Go - 单元测试","Go 内置了强大的测试框架，掌握测试是编写高质量代码的基础。",{"path":219,"title":220,"description":221},"\u002Fgolang\u002Fstdlib\u002Fbufio","bufio","在 Go 语言中，bufio 包提供了带缓冲的 I\u002FO 操作，能够提高读写性能。以下是一些常用的 bufio 包 API 及其详细说明：",{"path":223,"title":224,"description":225},"\u002Fgolang\u002Fstdlib\u002Fcontainer","container","在Go语言标准库中，container 包提供了几种常用的数据结构实现，这些数据结构对于高效地管理和操作数据非常有用。以下是 container 包中主要的数据结构：",{"path":227,"title":228,"description":229},"\u002Fgolang\u002Fstdlib\u002Fcrypto","crypto","在 Go 语言中，crypto 包提供了一组用于加密和解密的功能。以下是一些常用的 crypto 包及其子包的 API 及其详细说明：",{"path":231,"title":232,"description":233},"\u002Fgolang\u002Fstdlib\u002Fencoding-csv","encoding\u002Fcsv","在 Go 语言中，encoding\u002Fcsv 包提供了对 CSV（逗号分隔值）文件进行读写的功能。以下是一些常用的 encoding\u002Fcsv 包的 API 及其详细说明：",{"path":235,"title":236,"description":237},"\u002Fgolang\u002Fstdlib\u002Fencoding-json","encoding\u002Fjson","在 Go 语言中，encoding\u002Fjson 包提供了对 JSON 数据进行编码和解码的功能。以下是一些常用的 encoding\u002Fjson 包的 API 及其详细说明：",{"path":239,"title":240,"description":241},"\u002Fgolang\u002Fstdlib\u002Fencoding-xml","encoding\u002Fxml","在 Go 语言中，encoding\u002Fxml 包提供了对 XML 数据进行编码和解码的功能。以下是一些常用的 encoding\u002Fxml 包的 API 及其详细说明：",{"path":243,"title":244,"description":245},"\u002Fgolang\u002Fstdlib\u002Fflag","flag","在Go语言中，flag 包是用于处理命令行参数的标准库，它提供了一种简单而直接的方式来解析和使用命令行参数。下面是关于 flag 包的一些基本介绍和常用功能：",{"path":247,"title":248,"description":249},"\u002Fgolang\u002Fstdlib\u002Ffmt","fmt","在 Go 语言的标准库中，fmt 包是非常重要的，它提供了处理格式化输入和输出的基本工具。以下是一些 fmt 包内常用的API：",{"path":251,"title":252,"description":253},"\u002Fgolang\u002Fstdlib\u002Fhttp","net\u002Fhttp","在 Go 语言中，net\u002Fhttp 包提供了用于构建 HTTP 客户端和服务器的强大工具。以下是一些常用的 net\u002Fhttp 包的 API 及其详细说明：",{"path":255,"title":256,"description":257},"\u002Fgolang\u002Fstdlib\u002Fio","io","在 Go 语言中，io 包提供了基本的输入输出功能。以下是一些常用的 io 包的 API 及其详细说明：",{"path":259,"title":260,"description":261},"\u002Fgolang\u002Fstdlib\u002Flog","log","在 Go 语言中，log 包提供了简单的日志记录功能。以下是一些常用的 log 包的 API 及其详细说明：",{"path":263,"title":264,"description":265},"\u002Fgolang\u002Fstdlib\u002Fmath","math","在 Go 语言中，math 包提供了基本的数学函数和常量。以下是一些常用的 math 包的 API 及其详细说明：",{"path":267,"title":268,"description":11},"\u002Fgolang\u002Fstdlib\u002Fnet","net",{"path":270,"title":271,"description":272},"\u002Fgolang\u002Fstdlib\u002Fos","os","在Go语言中，os 包是一个非常重要且常用的标准库，它提供了与操作系统交互的功能，包括文件操作、环境变量管理、进程管理等。下面是一些 os 包中常用的功能和API：",{"path":274,"title":275,"description":276},"\u002Fgolang\u002Fstdlib\u002Fsort","order","在 Go 语言中，sort 包提供了对切片和用户定义的集合进行排序的函数。它实现了常见的排序算法，如快速排序（Quicksort）和堆排序（Heapsort），并且为自定义集合提供了接口，使得用户可以根据特定的需求进行排序。",{"path":278,"title":279,"description":280},"\u002Fgolang\u002Fstdlib\u002Fstrconv","strconv","在 Go 语言中，strconv 包提供了字符串和基本数据类型之间的转换函数，例如将整数转换为字符串、字符串转换为整数，以及其他类型之间的转换。这些功能非常有用，特别是在处理用户输入或从外部数据源读取数据时。",{"path":282,"title":283,"description":284},"\u002Fgolang\u002Fstdlib\u002Ftime","time","在 Go 语言中，time 包提供了处理时间和日期的功能。以下是一些常用的 time 包的 API 及其详细说明：",{"path":286,"title":287,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Ferror","Gin - 错误处理",{"path":289,"title":290,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Ffile","Gin - 文件处理",{"path":292,"title":293,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Fmiddleware","Gin - 中间件",{"path":295,"title":296,"description":297},"\u002Fgolang\u002Fweb\u002Fgin\u002Fquickstart","Gin - 快速开始","Gin 是目前最流行的 Go Web 框架，以高性能和简洁 API 著称。",{"path":299,"title":300,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Frequest","Gin - 请求处理",{"path":302,"title":303,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Fresponse","Gin - 响应处理",{"path":305,"title":306,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Frouter","Gin - 路由",{"path":308,"title":309,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Fvalidation","Gin - 参数校验",{"path":311,"title":312,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fassociation","GORM - 关联关系",{"path":314,"title":315,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fcrud","GORM - CRUD 操作",{"path":317,"title":318,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fmodel","GORM - 模型定义",{"path":320,"title":321,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fperformance","GORM - 日志与性能",{"path":323,"title":324,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fquery","GORM - 高级查询",{"path":326,"title":327,"description":328},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fquickstart","GORM - 快速开始","GORM 是 Go 语言最流行的 ORM 库，功能强大，使用简单。",{"path":330,"title":331,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Ftransaction","GORM - 事务与 Hook",{"path":333,"title":334,"description":335},"\u002Finterview\u002Fbasic","计算机基础面经","本章节汇总了面试中常见的通用技术概念，不局限于特定语言或数据库，是考察技术内功的关键考点。",{"path":337,"title":338,"description":339},"\u002Finterview\u002Fgolang","Golang 面试题","Go 语言面试高频考点，覆盖基础语法、数据结构、并发编程、内存管理、GC、调度器等核心知识。",{"path":341,"title":342,"description":343},"\u002Finterview\u002Fk8s","Kubernetes 面试题","Kubernetes（K8s）面试高频考点，覆盖架构原理、核心资源、网络存储、调度策略、运维监控等核心知识。",{"path":345,"title":346,"description":347},"\u002Finterview\u002Fmysql","MySQL 面试题","MySQL 数据库面试高频考点，覆盖索引、事务、锁、优化、主从复制等核心知识。",{"path":349,"title":350,"description":351},"\u002Finterview\u002Fredis","Redis 面试题","Redis 面试高频考点，覆盖数据结构、持久化、集群、缓存一致性、性能优化等核心知识。",{"path":353,"title":354,"description":355},"\u002Finterview\u002Frocketmq","RocketMQ 面试题","RocketMQ 面试高频考点，覆盖消息模型、可靠性、顺序消息、事务消息、存储与高可用等核心知识。",{"path":357,"title":358,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-arraylist","List - ArrayList 源码解析",{"path":360,"title":361,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-linkedlist","List - LinkedList 源码解析",{"path":363,"title":364,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-stack","List - Satck源码解析",{"path":366,"title":367,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-vectore","List - Vector 源码解析",{"path":369,"title":370,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fmap-hashmap","Map - HashMap 源码解析",{"path":372,"title":373,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fmap-linkedhashmap","Map - LinkedHashMap 源码解析",{"path":375,"title":376,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fmap-treemap","Map - TreeMap 源码解析",{"path":378,"title":379,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fqueue-deque","Queue - Deque 接口解析",{"path":381,"title":382,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fqueue-queue","Queue - Queue 接口解析",{"path":384,"title":385,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fset-hashset","Set - HashSet源码解析",{"path":387,"title":388,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fset-linkedhashset","Set - LinkedHashSet 源码解析",{"path":390,"title":391,"description":392},"\u002Fother\u002Fjava\u002Fcollection\u002Fset-treeset","Set - TreeSet源码解析","TreeSet 是一个 Set 集合接口的实现类，与 HashSet 类似，其底层也是通过维护了一个 TreeMap 对象来封装了一些实现方法，故本篇不再对 TreeSet 的底层原理进行详细说明，仅对常用 API 做简单介绍，如需了解 TreeMap 的底层实现原理，请移步 Map - HashMap 源码解析",{"path":394,"title":395,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fannotation","Java核心 - 注解",{"path":397,"title":398,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fbasic-grammar","Java核心 - 基础语法",{"path":400,"title":401,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fclass-and-object","Java核心 - 面向对象",{"path":403,"title":404,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fcommon-classes","Java核心 - 常用类",{"path":406,"title":407,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fexception","Java核心 - 异常处理",{"path":409,"title":410,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fgenerics","Java核心 - 泛型",{"path":412,"title":413,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fjdk-env-path","Java核心 - 环境搭建",{"path":415,"title":416,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Freflection","Java核心 - 反射",{"path":418,"title":419,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fstring","Java核心 - String 字符串",{"path":421,"title":422,"description":423},"\u002Fother\u002Fjava\u002Fio\u002Fbuffer-stream","Java IO - 缓冲流","缓冲流是对基本流的包装，通过内置缓冲区减少系统调用次数，大幅提升读写效率。",{"path":425,"title":426,"description":427},"\u002Fother\u002Fjava\u002Fio\u002Fbyte-stream","Java IO - 字节流","字节流是 Java IO 中最基本的流类型，以字节（byte）为单位进行数据读写，可以处理任意类型的文件。",{"path":429,"title":430,"description":431},"\u002Fother\u002Fjava\u002Fio\u002Fchar-stream","Java IO - 字符流","字符流以字符为单位进行读写，专门用于处理文本文件。相比字节流，字符流能够正确处理字符编码，避免中文乱码问题。",{"path":433,"title":434,"description":11},"\u002Fother\u002Fjava\u002Fio\u002Ffile","Java IO - File 类",{"path":436,"title":437,"description":11},"\u002Fother\u002Fjava\u002Fio\u002Fio-stream-system","Java IO - IO流概述",{"path":439,"title":440,"description":441},"\u002Fother\u002Fjava\u002Fio\u002Fnio","Java IO - NIO","NIO（New IO）是 JDK 1.4 引入的新 IO 模型，提供了更高效的 IO 操作方式，支持非阻塞 IO 和多路复用。",{"path":443,"title":444,"description":445},"\u002Fother\u002Fjava\u002Fjvm\u002Fclass-loading","类加载机制","类加载机制是 JVM 将 .class 文件加载到内存，并对数据进行校验、转换解析和初始化，最终形成可被 JVM 直接使用的 Java 类型的过程。",{"path":447,"title":448,"description":449},"\u002Fother\u002Fjava\u002Fjvm\u002Fgarbage-collection","垃圾回收","垃圾回收（Garbage Collection，GC）是 JVM 自动管理内存的机制，负责回收不再使用的对象所占用的内存。",{"path":451,"title":452,"description":453},"\u002Fother\u002Fjava\u002Fjvm\u002Fjvm-memory","JVM 内存结构","JVM 在执行 Java 程序时，会把它管理的内存划分为若干个不同的数据区域。这些区域有各自的用途、创建和销毁时间。",{"path":455,"title":456,"description":457},"\u002Fother\u002Fjava\u002Fjvm\u002Fjvm-tuning","JVM 调优","JVM 调优是优化 Java 应用性能的重要手段，主要包括参数配置、性能监控和问题排查。",{"path":459,"title":460,"description":461},"\u002Fother\u002Fjava\u002Fthread\u002Fatomic","原子类","Java 原子类（Atomic Classes）提供了一种无锁的线程安全方式，基于 CAS（Compare-And-Swap）操作实现。",{"path":463,"title":464,"description":465},"\u002Fother\u002Fjava\u002Fthread\u002Fcompletable-future","CompletableFuture","CompletableFuture 是 JDK 8 引入的异步编程工具，实现了 Future 和 CompletionStage 接口，支持函数式编程和链式调用。",{"path":467,"title":468,"description":469},"\u002Fother\u002Fjava\u002Fthread\u002Fconcurrent-collections","并发集合","Java 并发包提供了多种线程安全的集合类，用于替代传统的同步集合（如 Collections.synchronizedList）。",{"path":471,"title":472,"description":473},"\u002Fother\u002Fjava\u002Fthread\u002Fconcurrent-utils","并发工具类","Java 并发包提供了多种实用的并发工具类，用于控制线程之间的协调与同步。",{"path":475,"title":476,"description":11},"\u002Fother\u002Fjava\u002Fthread\u002Fsynchronized-lock","同步机制",{"path":478,"title":479,"description":11},"\u002Fother\u002Fjava\u002Fthread\u002Fthread-basic","线程基础",{"path":481,"title":482,"description":11},"\u002Fother\u002Fjava\u002Fthread\u002Fthread-pool","线程池",{"path":484,"title":485,"description":486},"\u002Fother\u002Fspring-series\u002Fspring\u002Fannotations-beans","Spring - 基于注解管理Bean","从 Java 5 开始，Java 增加了对注解（Annotation）的支持，它是代码中的一种特殊标记，可以在编译、类加载和运行时被读取，执行相应的处理。开发人员可以通过注解在不改变原有代码和逻辑的情况下，在源代码中嵌入补充信息。",{"path":488,"title":489,"description":490},"\u002Fother\u002Fspring-series\u002Fspring\u002Fimplement-ioc","Spring - 原理手写IoC","Spring 框架的 IOC 是基于 Java 反射机制实现的，在学习手写 IoC 之前，你需要具备一定的 Java 反射相关的知识，参考本站内的 Java 教程。",{"path":492,"title":493,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fintroduction-case","Spring - 入门案例",{"path":495,"title":496,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-aop","Spring - 面向切面AOP",{"path":498,"title":499,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-aot","Spring - AOT提前编译",{"path":501,"title":502,"description":503},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-data-validation","Spring - 数据校验","在开发中，我们经常遇到参数校验的需求，比如用户注册的时候，要校验用户名不能为空、用户名长度不超过20个字符、手机号是合法的手机号格式等等。如果使用普通方式，我们会把校验的代码和真正的业务处理逻辑耦合在一起，而且如果未来要新增一种校验逻辑也需要在修改多个地方。而spring validation允许通过注解的方式来定义对象校验规则，把校验和业务逻辑分离开，让代码编写更加方便。Spring Validation其实就是对Hibernate Validator进一步的封装，方便在Spring中使用。",{"path":505,"title":506,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-i18n","Spring - 国际化i18n",{"path":508,"title":509,"description":510},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-ioc","Spring - IOC容器","IoC 是 Inversion of Control 的简写，译为“控制反转”，它不是一门技术，而是一种设计思想，是一个重要的面向对象编程法则，能够指导我们如何设计出松耦合、更优良的程序。",{"path":512,"title":513,"description":514},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-junit","Spring - 单元测试JUnit","在之前的测试方法中，几乎都能看到以下的两行代码：",{"path":516,"title":517,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-resources","Spring - 资源操作",{"path":519,"title":520,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-summarize","Spring - Spring概述",{"path":522,"title":523,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-transaction","Spring - 事务",{"path":525,"title":526,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fxml-beans","Spring - 基于XML管理Bean",{"path":528,"title":529,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-config","SpringBoot - 配置详解",{"path":531,"title":532,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-data","SpringBoot - 数据访问",{"path":534,"title":535,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-quickstart","SpringBoot - 快速入门",{"path":537,"title":538,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-web","SpringBoot - Web 开发",{"path":540,"title":541,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-config","SpringCloud - 配置中心",{"path":543,"title":544,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-discovery","SpringCloud - 服务注册与发现",{"path":546,"title":547,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-feign","SpringCloud - 服务调用",{"path":549,"title":550,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-gateway","SpringCloud - 服务网关",{"path":552,"title":553,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-introduction","SpringCloud - 微服务概述",{"path":555,"title":556,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-sentinel","SpringCloud - 服务保护",{"path":558,"title":559,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-databind","SpringMVC - 数据绑定与转换",{"path":561,"title":562,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-exception","SpringMVC - 异常处理",{"path":564,"title":565,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-interceptor","SpringMVC - 拦截器",{"path":567,"title":568,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-introduction","SpringMVC - 简介与环境搭建",{"path":570,"title":571,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-request","SpringMVC - 请求处理",{"path":573,"title":574,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-response","SpringMVC - 响应处理",{"path":576,"title":577,"description":578},"\u002Fproject\u002Frocket-leaf\u002Farchitecture","项目架构","Rocket-Leaf 的目录结构、模块划分、数据流向，以及各层之间的依赖关系。",{"path":580,"title":581,"description":582},"\u002Fproject\u002Frocket-leaf\u002Fbackend-layers","后端分层设计","Rocket-Leaf 的 model \u002F rocketmq \u002F service 三层结构，以及服务之间的依赖关系与设计取舍。",{"path":584,"title":585,"description":586},"\u002Fproject\u002Frocket-leaf\u002Fclient-manager","RocketMQ 客户端管理器","AdminClientManager 的多客户端池、默认连接懒加载、自动重连重试的设计与实现。",{"path":588,"title":589,"description":590},"\u002Fproject\u002Frocket-leaf\u002Fencryption","连接信息加密存储","AES-256-GCM + SHA-256 字段级派生密钥的实现，以及如何在不破坏兼容性的前提下为历史明文数据做透明迁移。",{"path":592,"title":593,"description":594},"\u002Fproject\u002Frocket-leaf\u002Ffrontend","前端结构与类型绑定","React + Vite 目录组织、自动生成的 Wails 绑定、api 薄封装与自定义 hooks 的职责划分。",{"path":596,"title":597,"description":598},"\u002Fproject\u002Frocket-leaf","项目简介","Rocket-Leaf 是一款基于 Wails v3 构建的跨平台 RocketMQ 桌面管理客户端，Go 后端 + React 前端。本文档系列拆解它的架构与关键实现。",{"path":600,"title":601,"description":602},"\u002Fproject\u002Frocket-leaf\u002Fwails-v3","Wails v3 入门","Wails v3 的核心概念、Service 绑定机制，以及 Rocket-Leaf 是如何用它把 Go 后端和 React 前端打通的。",{"path":604,"title":605,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-basic","Docker - 入门基础",{"path":607,"title":608,"description":609},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-compose","Docker - Compose","在部署应用时，常常使用到不止一个容器，那么在部署容器的时候就需要一个一个进行部署，这样的部署过程也相对来说比较繁琐复杂，也容易出问题，那么有没有一种更为简单的方法呢？",{"path":611,"title":612,"description":613},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-container-connection","Docker - 容器互联","在上一个章节中我们学习了 Docker 容器的端口映射，可以将 Docker 容器和本地以及网络中的端口进行连接起来。",{"path":615,"title":616,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-dockerfile","Docker - Dockerfile",{"path":618,"title":619,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-helloworld","Docker - HelloWorld",{"path":621,"title":622,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-install","Docker - 安装",{"path":624,"title":625,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-introduce","Docker - 简介",{"path":627,"title":628,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-object","Docker - 镜像、容器、仓库",{"path":630,"title":631,"description":632},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-warehouse","Docker - 仓库管理","仓库是集中存放资源的地方，代码仓库是存放代码的，那么Docker 中的仓库就是存放 Docker 镜像的。",{"path":634,"title":635,"description":636},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-web-containers","Docker - WEB应用实例","在之前的章节中，仅对普通容器进行了演示，但在实际中常常使用到 Docker 容器中的 WEB 应用程序。",{"path":638,"title":639,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-config","Kubernetes - ConfigMap 与 Secret",{"path":641,"title":642,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-helm","Kubernetes - Helm 包管理",{"path":644,"title":645,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-install","Kubernetes - 集群安装",{"path":647,"title":648,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-introduction","Kubernetes - 简介与架构",{"path":650,"title":651,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-kubectl","Kubernetes - kubectl 命令行工具",{"path":653,"title":654,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-monitoring","Kubernetes - 监控与日志",{"path":656,"title":657,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-network-security","Kubernetes - 网络与安全",{"path":659,"title":660,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-service","Kubernetes - Service 与 Ingress",{"path":662,"title":663,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-storage","Kubernetes - 持久化存储",{"path":665,"title":666,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-workload","Kubernetes - 工作负载资源",{"path":668,"title":669,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-bash","Linux - Bash 基础语法",{"path":671,"title":672,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-file-directory","Linux - 文件与目录操作",{"path":674,"title":675,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-network","Linux - 网络配置",{"path":677,"title":678,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-package","Linux - 软件包管理",{"path":680,"title":681,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-process","Linux - 进程管理",{"path":683,"title":684,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-scripts","Linux - 常用脚本示例",{"path":686,"title":687,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-service","Linux - 服务管理",{"path":689,"title":690,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-user-permission","Linux - 用户与权限管理",{"path":692,"title":693,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-https","Nginx - HTTPS 配置",{"path":695,"title":696,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-install","Nginx - 安装与配置",{"path":698,"title":699,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-loadbalance","Nginx - 负载均衡",{"path":701,"title":702,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-optimization","Nginx - 性能优化",{"path":704,"title":705,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-proxy","Nginx - 反向代理",{"path":707,"title":708,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-static","Nginx - 静态资源服务",{"path":710,"title":711,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-vhost","Nginx - 虚拟主机配置",{"path":713,"title":714,"description":715},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-architecture","MySQL 高可用架构","主从复制、读写分离、分库分表。",{"path":717,"title":718,"description":719},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-index","MySQL 索引","索引是帮助 MySQL 高效获取数据的有序数据结构。",{"path":721,"title":722,"description":723},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-lock","MySQL 锁","锁用于解决并发访问时的数据一致性问题。",{"path":725,"title":726,"description":727},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-optimize","MySQL 性能优化","SQL 优化是后端开发必备技能。",{"path":729,"title":730,"description":731},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-transaction","MySQL 事务","事务是一组不可分割的操作，要么全部成功，要么全部失败。",{"path":733,"title":734,"description":735},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fsql-advanced","SQL 进阶","多表查询、子查询、函数、视图、存储过程。",{"path":737,"title":738,"description":739},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fsql-basic","SQL 基础","SQL（Structured Query Language）是操作关系型数据库的标准语言。",{"path":741,"title":742,"description":743},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-advanced","Redis 进阶功能","事务、发布订阅、Lua 脚本、Pipeline。",{"path":745,"title":746,"description":747},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-basic","Redis 基础","Redis 安装配置与基本命令。",{"path":749,"title":750,"description":751},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-cluster","Redis 高可用","主从复制、哨兵、Cluster 集群。",{"path":753,"title":754,"description":755},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-datatype","Redis 数据类型","Redis 5 种基本数据类型 + 4 种特殊类型。",{"path":757,"title":758,"description":759},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-optimize","Redis 性能优化","内存优化、缓存问题、最佳实践。",{"path":761,"title":762,"description":763},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-persistence","Redis 持久化","Redis 提供 RDB 和 AOF 两种持久化方式。",{"path":765,"title":766,"description":767},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-principle","Redis 底层原理","数据结构、线程模型、网络模型。",{"path":769,"title":770,"description":771},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fbehaiver-patterns\u002Fobserver-pattern","观察者模式","观察者模式属于行为型模式，定义了对象之间的一对多的依赖关系，在这种模式中，当一个对象的状态发生变化时，所有依赖于它的对象都会得到通知，并且执行相关操作。观察者模式又被成为“发布—订阅模式”，即发布者发生改变后，会通知所有订阅者。",{"path":773,"title":774,"description":11},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fcreate-patterns\u002Ffactory-pattern","工厂模式",{"path":776,"title":777,"description":778},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fcreate-patterns\u002Fsingleton-pattern","单例模式","单例模式是最常用的设计模式之一，他可以保证在整个应用中，某个类只存在一个实例化对象，即全局使用到该类的只有一个对象，这种模式在需要限制某些类的实例数量时非常有用，通常全局只需要一个该对象即可，如一些配置文件映射对象、数据库连接对象等。",{"path":780,"title":781,"description":782},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fstructural-patterns\u002Fadapter-pattern","适配器模式","适配器模式是一种结构型模式，可以将一个类的接口转换成客户端所期望的另一种接口，适配器模式可以帮助开发人员在不修改现有代码的情况下，将不兼容的类组合在一起。",{"path":784,"title":785,"description":786},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-basic-operations","Git 创建版本库","在 Git 上创建版本库有两种方式，一种是直接拷贝远程 Git 仓库到本地，另外一种是我们自己创建本地的版本库。",{"path":788,"title":789,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-branch-manage","Git 分支管理",{"path":791,"title":792,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-content-operations","Git 仓库内容操作",{"path":794,"title":795,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-introduce-install","Git 介绍和安装",{"path":797,"title":798,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-remote-manage","Git 远程管理",{"path":800,"title":801,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-workspace-index-repo","Git 工作原理",{"path":803,"title":804,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fhomebrew","HomeBrew 教程",{"path":806,"title":807,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fidea\u002Fshortcuts","快捷键",{"path":809,"title":810,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fmaven\u002Fintroduce-install-config","Maven - 介绍、安装、配置",{"path":812,"title":813,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fbasic-knowledge","2. 基础知识",{"path":815,"title":816,"description":817},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fcomponent-communication","9. 组件通信","在前面的章节内，介绍了 Vue 中最核心的内容——组件的介绍和使用，和 Java 等编程语言相反，组件并不近似于这些变成语言中的类，类可以通过类或者其实例化的对象来相互交互，但 Vue 组件之间的作用域是相互独立的，这就意味着不同组件之间的数据无法相互引用。",{"path":819,"title":820,"description":821},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fcomputed","4. 计算属性","虽然直接在模板中使用表达式方便，但是如果在模板中添加很多逻辑，会让模板变的臃肿且难维护，耦合度较高。有没有一种简单的方式来实现呢？答案是有的。",{"path":823,"title":824,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fcreate-vue-project","1. 环境搭建及安装",{"path":826,"title":827,"description":828},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Flife-cycle","6. 生命周期","生命周期是指组件从创建、挂载、更新到销毁的整个过程中所经历的一系列阶段。在 Vue 中，每个组件都有自己的生命周期，可以通过生命周期钩子函数来监听和处理组件在不同阶段的行为和状态。",{"path":830,"title":831,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fother-api","10. 其他 API",{"path":833,"title":834,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fpinia","8. Pinia",{"path":836,"title":837,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Frouter","7. 路由",{"path":839,"title":840,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Ftemplate-grammar","3. 指令及模板语法",{"path":842,"title":843,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fvue3-new-component","11. Vue3 新组件",{"path":845,"title":846,"description":847},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fwatch","5. 监视","Watch 是 Vue 提供的一个用于监视响应式数据变化并执行相应操作的 API，能够对响应式数据的变化做出一些操作的功能。Vue3 中的 Watch 支持多种用法，包括监视响应式对象、ref 对象、数组、函数等。",{"path":849,"title":850,"description":11},"\u002Ftutorials\u002Fmq\u002Fkafka\u002Fkafka-introduction","Kafka 简介与安装",{"path":852,"title":853,"description":11},"\u002Ftutorials\u002Fmq\u002Fkafka\u002Fkafka-producer-consumer","Kafka 生产者与消费者",{"path":855,"title":856,"description":857},"\u002Ftutorials\u002Fmq\u002Fkafka\u002Fkafka-springboot","Spring Boot 整合 Kafka","Spring Kafka 提供了对 Apache Kafka 的便捷集成。",{"path":859,"title":860,"description":861},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-exchange","RabbitMQ Exchange 详解","Exchange（交换机）是 RabbitMQ 的核心组件，负责接收生产者发送的消息，并根据规则将消息路由到一个或多个队列。",{"path":863,"title":864,"description":11},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-introduction","RabbitMQ 简介与安装",{"path":866,"title":867,"description":868},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-reliability","RabbitMQ 消息可靠性","消息可靠性是消息队列的核心要求，RabbitMQ 提供了多种机制来保证消息不丢失。",{"path":870,"title":871,"description":872},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-springboot","Spring Boot 整合 RabbitMQ","Spring AMQP 提供了对 RabbitMQ 的便捷集成，大大简化了开发工作。",{"path":874,"title":875,"description":11},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-client","RocketMQ 客户端使用",{"path":877,"title":878,"description":11},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-concepts","RocketMQ 核心概念",{"path":880,"title":881,"description":11},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-installation","RocketMQ 安装部署",{"path":883,"title":884,"description":885},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-message-type","RocketMQ 消息类型","RocketMQ 支持多种消息类型，满足不同业务场景需求。",{"id":887,"title":50,"body":888,"description":51,"extension":3953,"meta":3954,"navigation":1076,"path":49,"seo":3955,"stem":3956,"__hash__":3957},"docs\u002Fai\u002Ffundamentals\u002Fneural-networks.md",{"type":889,"value":890,"toc":3924},"minimark",[891,895,899,910,914,926,931,934,937,958,962,965,971,974,1045,1162,1166,1169,1183,1243,1247,1350,1354,1358,1813,1817,1820,1824,1827,1830,1836,2002,2006,2010,2017,2023,2026,2076,2240,2244,2255,2374,2378,2450,2454,2458,2461,2464,2467,2470,2484,2490,2842,2846,2849,3297,3300,3303,3353,3356,3360,3494,3497,3501,3787,3791,3794,3800,3803,3806,3888,3891,3894,3897,3917,3920],[892,893,894],"h2",{"id":894},"概述",[896,897,898],"p",{},"神经网络架构的设计决定了模型能处理什么类型的数据。不同的任务（图像、文本、序列）需要不同的网络结构。本文介绍三种最重要的神经网络架构：CNN、RNN 及其变体，以及注意力机制。",[900,901,907],"pre",{"className":902,"code":904,"language":905,"meta":906},[903],"language-text","flowchart LR\n    FC[\"全连接网络\"] --> CNN[\"CNN#40;图像#41;\"] --> RNN[\"RNN\u002FLSTM#40;序列#41;\"] --> Att[\"Attention\"] --> Tr[\"Transformer#40;通用#41;\"]\n","text","mermaid",[908,909,904],"code",{"__ignoreMap":11},[892,911,913],{"id":912},"卷积神经网络cnn","卷积神经网络（CNN）",[896,915,916,917,921,922,925],{},"CNN 是处理图像数据的核心架构。其核心思想是利用",[918,919,920],"strong",{},"局部感受野","和",[918,923,924],{},"权重共享","来高效提取空间特征。",[927,928,930],"h3",{"id":929},"为什么需要-cnn","为什么需要 CNN",[896,932,933],{},"一张 224x224 的 RGB 图片有 224 × 224 × 3 = 150,528 个像素值。如果用全连接网络直接处理，第一个隐藏层（假设 1024 个神经元）就需要 1.5 亿个参数——计算量巨大且极易过拟合。",[896,935,936],{},"CNN 通过卷积操作解决了这个问题：",[938,939,940,947,952],"ul",{},[941,942,943,946],"li",{},[918,944,945],{},"局部连接","：每个神经元只关注输入的一小块区域",[941,948,949,951],{},[918,950,924],{},"：同一个卷积核在整个图像上滑动，大幅减少参数量",[941,953,954,957],{},[918,955,956],{},"平移不变性","：无论目标出现在图像的哪个位置，都能被检测到",[927,959,961],{"id":960},"卷积操作convolution","卷积操作（Convolution）",[896,963,964],{},"卷积核（Filter\u002FKernel）是一个小矩阵，在输入图像上滑动，逐个位置计算点积，生成特征图（Feature Map）。",[900,966,969],{"className":967,"code":968,"language":905},[903],"输入 (5×5)          卷积核 (3×3)        输出特征图 (3×3)\n┌─┬─┬─┬─┬─┐        ┌─┬─┬─┐           ┌──┬──┬──┐\n│1│0│1│0│1│        │1│0│1│           │ 4│ 3│ 4│\n├─┼─┼─┼─┼─┤        ├─┼─┼─┤           ├──┼──┼──┤\n│0│1│0│1│0│   *    │0│1│0│    =      │ 2│ 4│ 3│\n├─┼─┼─┼─┼─┤        ├─┼─┼─┤           ├──┼──┼──┤\n│1│0│1│0│1│        │1│0│1│           │ 4│ 3│ 4│\n├─┼─┼─┼─┼─┤        └─┴─┴─┘           └──┴──┴──┘\n│0│1│0│1│0│\n├─┼─┼─┼─┼─┤\n│1│0│1│0│1│\n└─┴─┴─┴─┴─┘\n",[908,970,968],{"__ignoreMap":11},[896,972,973],{},"关键参数：",[975,976,977,993],"table",{},[978,979,980],"thead",{},[981,982,983,987,990],"tr",{},[984,985,986],"th",{},"参数",[984,988,989],{},"说明",[984,991,992],{},"影响",[994,995,996,1008,1019,1034],"tbody",{},[981,997,998,1002,1005],{},[999,1000,1001],"td",{},"kernel_size",[999,1003,1004],{},"卷积核大小",[999,1006,1007],{},"感受野范围，常用 3×3、5×5",[981,1009,1010,1013,1016],{},[999,1011,1012],{},"stride",[999,1014,1015],{},"滑动步长",[999,1017,1018],{},"步长越大，输出越小",[981,1020,1021,1024,1027],{},[999,1022,1023],{},"padding",[999,1025,1026],{},"边缘填充",[999,1028,1029,1030,1033],{},"控制输出尺寸，",[908,1031,1032],{},"same"," padding 保持尺寸不变",[981,1035,1036,1039,1042],{},[999,1037,1038],{},"out_channels",[999,1040,1041],{},"卷积核数量",[999,1043,1044],{},"决定输出特征图的数量（通道数）",[900,1046,1050],{"className":1047,"code":1048,"language":1049,"meta":11,"style":11},"language-python shiki shiki-themes github-light github-light github-dark","import torch.nn as nn\n\n# 卷积层：输入 3 通道（RGB），输出 64 个特征图，3×3 卷积核\nconv = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=1, padding=1)\n\n# 输出尺寸计算：(输入尺寸 - kernel_size + 2 * padding) \u002F stride + 1\n# (224 - 3 + 2) \u002F 1 + 1 = 224  (尺寸保持不变)\n","python",[908,1051,1052,1071,1078,1085,1145,1150,1156],{"__ignoreMap":11},[1053,1054,1057,1061,1065,1068],"span",{"class":1055,"line":1056},"line",1,[1053,1058,1060],{"class":1059},"s8jYJ","import",[1053,1062,1064],{"class":1063},"sxrX7"," torch.nn ",[1053,1066,1067],{"class":1059},"as",[1053,1069,1070],{"class":1063}," nn\n",[1053,1072,1074],{"class":1055,"line":1073},2,[1053,1075,1077],{"emptyLinePlaceholder":1076},true,"\n",[1053,1079,1081],{"class":1055,"line":1080},3,[1053,1082,1084],{"class":1083},"sCsY4","# 卷积层：输入 3 通道（RGB），输出 64 个特征图，3×3 卷积核\n",[1053,1086,1088,1091,1094,1097,1101,1103,1107,1110,1112,1114,1117,1119,1121,1123,1125,1127,1129,1131,1134,1136,1138,1140,1142],{"class":1055,"line":1087},4,[1053,1089,1090],{"class":1063},"conv ",[1053,1092,1093],{"class":1059},"=",[1053,1095,1096],{"class":1063}," nn.Conv2d(",[1053,1098,1100],{"class":1099},"sP4rz","in_channels",[1053,1102,1093],{"class":1059},[1053,1104,1106],{"class":1105},"sBjJW","3",[1053,1108,1109],{"class":1063},", ",[1053,1111,1038],{"class":1099},[1053,1113,1093],{"class":1059},[1053,1115,1116],{"class":1105},"64",[1053,1118,1109],{"class":1063},[1053,1120,1001],{"class":1099},[1053,1122,1093],{"class":1059},[1053,1124,1106],{"class":1105},[1053,1126,1109],{"class":1063},[1053,1128,1012],{"class":1099},[1053,1130,1093],{"class":1059},[1053,1132,1133],{"class":1105},"1",[1053,1135,1109],{"class":1063},[1053,1137,1023],{"class":1099},[1053,1139,1093],{"class":1059},[1053,1141,1133],{"class":1105},[1053,1143,1144],{"class":1063},")\n",[1053,1146,1148],{"class":1055,"line":1147},5,[1053,1149,1077],{"emptyLinePlaceholder":1076},[1053,1151,1153],{"class":1055,"line":1152},6,[1053,1154,1155],{"class":1083},"# 输出尺寸计算：(输入尺寸 - kernel_size + 2 * padding) \u002F stride + 1\n",[1053,1157,1159],{"class":1055,"line":1158},7,[1053,1160,1161],{"class":1083},"# (224 - 3 + 2) \u002F 1 + 1 = 224  (尺寸保持不变)\n",[927,1163,1165],{"id":1164},"池化操作pooling","池化操作（Pooling）",[896,1167,1168],{},"池化层对特征图进行下采样，减少数据量并增强特征的鲁棒性。",[938,1170,1171,1177],{},[941,1172,1173,1176],{},[918,1174,1175],{},"最大池化（Max Pooling）","：取窗口内最大值，保留最显著的特征",[941,1178,1179,1182],{},[918,1180,1181],{},"平均池化（Average Pooling）","：取窗口内平均值，保留整体信息",[900,1184,1186],{"className":1047,"code":1185,"language":1049,"meta":11,"style":11},"# 2×2 最大池化，步长为 2，将特征图尺寸减半\nmax_pool = nn.MaxPool2d(kernel_size=2, stride=2)\n\n# 全局平均池化，将每个特征图压缩为一个值\nglobal_avg_pool = nn.AdaptiveAvgPool2d(1)\n",[908,1187,1188,1193,1220,1224,1229],{"__ignoreMap":11},[1053,1189,1190],{"class":1055,"line":1056},[1053,1191,1192],{"class":1083},"# 2×2 最大池化，步长为 2，将特征图尺寸减半\n",[1053,1194,1195,1198,1200,1203,1205,1207,1210,1212,1214,1216,1218],{"class":1055,"line":1073},[1053,1196,1197],{"class":1063},"max_pool ",[1053,1199,1093],{"class":1059},[1053,1201,1202],{"class":1063}," nn.MaxPool2d(",[1053,1204,1001],{"class":1099},[1053,1206,1093],{"class":1059},[1053,1208,1209],{"class":1105},"2",[1053,1211,1109],{"class":1063},[1053,1213,1012],{"class":1099},[1053,1215,1093],{"class":1059},[1053,1217,1209],{"class":1105},[1053,1219,1144],{"class":1063},[1053,1221,1222],{"class":1055,"line":1080},[1053,1223,1077],{"emptyLinePlaceholder":1076},[1053,1225,1226],{"class":1055,"line":1087},[1053,1227,1228],{"class":1083},"# 全局平均池化，将每个特征图压缩为一个值\n",[1053,1230,1231,1234,1236,1239,1241],{"class":1055,"line":1147},[1053,1232,1233],{"class":1063},"global_avg_pool ",[1053,1235,1093],{"class":1059},[1053,1237,1238],{"class":1063}," nn.AdaptiveAvgPool2d(",[1053,1240,1133],{"class":1105},[1053,1242,1144],{"class":1063},[927,1244,1246],{"id":1245},"经典-cnn-架构","经典 CNN 架构",[975,1248,1249,1265],{},[978,1250,1251],{},[981,1252,1253,1256,1259,1262],{},[984,1254,1255],{},"架构",[984,1257,1258],{},"年份",[984,1260,1261],{},"层数",[984,1263,1264],{},"关键创新",[994,1266,1267,1281,1295,1309,1322,1336],{},[981,1268,1269,1272,1275,1278],{},[999,1270,1271],{},"LeNet-5",[999,1273,1274],{},"1998",[999,1276,1277],{},"5",[999,1279,1280],{},"CNN 的开山之作",[981,1282,1283,1286,1289,1292],{},[999,1284,1285],{},"AlexNet",[999,1287,1288],{},"2012",[999,1290,1291],{},"8",[999,1293,1294],{},"ReLU + Dropout，开启深度学习时代",[981,1296,1297,1300,1303,1306],{},[999,1298,1299],{},"VGGNet",[999,1301,1302],{},"2014",[999,1304,1305],{},"16\u002F19",[999,1307,1308],{},"统一使用 3×3 小卷积核",[981,1310,1311,1314,1316,1319],{},[999,1312,1313],{},"GoogLeNet",[999,1315,1302],{},[999,1317,1318],{},"22",[999,1320,1321],{},"Inception 模块，多尺度特征",[981,1323,1324,1327,1330,1333],{},[999,1325,1326],{},"ResNet",[999,1328,1329],{},"2015",[999,1331,1332],{},"50\u002F101\u002F152",[999,1334,1335],{},"残差连接，解决梯度消失",[981,1337,1338,1341,1344,1347],{},[999,1339,1340],{},"EfficientNet",[999,1342,1343],{},"2019",[999,1345,1346],{},"变化",[999,1348,1349],{},"统一缩放深度\u002F宽度\u002F分辨率",[1351,1352,1353],"note",{},"\nResNet 提出的残差连接（Skip Connection）是深度学习领域最重要的突破之一。它让梯度可以直接跳过若干层传播，从而训练数百层深的网络。这个思想至今仍被广泛使用（包括 Transformer）。\n",[927,1355,1357],{"id":1356},"pytorch-实现一个简单的-cnn","PyTorch 实现一个简单的 CNN",[900,1359,1361],{"className":1047,"code":1360,"language":1049,"meta":11,"style":11},"import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\n\nclass SimpleCNN(nn.Module):\n    def __init__(self, num_classes=10):\n        super().__init__()\n        # 特征提取部分\n        self.features = nn.Sequential(\n            nn.Conv2d(1, 32, kernel_size=3, padding=1),   # 28×28×1 → 28×28×32\n            nn.ReLU(),\n            nn.MaxPool2d(2),                               # 28×28×32 → 14×14×32\n\n            nn.Conv2d(32, 64, kernel_size=3, padding=1),   # 14×14×32 → 14×14×64\n            nn.ReLU(),\n            nn.MaxPool2d(2),                               # 14×14×64 → 7×7×64\n        )\n        # 分类部分\n        self.classifier = nn.Sequential(\n            nn.Flatten(),\n            nn.Linear(64 * 7 * 7, 128),\n            nn.ReLU(),\n            nn.Dropout(0.5),\n            nn.Linear(128, num_classes)\n        )\n\n    def forward(self, x):\n        x = self.features(x)\n        x = self.classifier(x)\n        return x\n\nmodel = SimpleCNN()\n# 测试前向传播\nsample = torch.randn(1, 1, 28, 28)\noutput = model(sample)\nprint(f\"输出形状: {output.shape}\")  # torch.Size([1, 10])\n",[908,1362,1363,1370,1380,1392,1396,1420,1438,1452,1458,1472,1507,1513,1527,1532,1564,1569,1581,1587,1593,1605,1611,1637,1642,1653,1663,1668,1673,1684,1698,1710,1719,1724,1735,1741,1769,1780],{"__ignoreMap":11},[1053,1364,1365,1367],{"class":1055,"line":1056},[1053,1366,1060],{"class":1059},[1053,1368,1369],{"class":1063}," torch\n",[1053,1371,1372,1374,1376,1378],{"class":1055,"line":1073},[1053,1373,1060],{"class":1059},[1053,1375,1064],{"class":1063},[1053,1377,1067],{"class":1059},[1053,1379,1070],{"class":1063},[1053,1381,1382,1384,1387,1389],{"class":1055,"line":1080},[1053,1383,1060],{"class":1059},[1053,1385,1386],{"class":1063}," torch.nn.functional ",[1053,1388,1067],{"class":1059},[1053,1390,1391],{"class":1063}," F\n",[1053,1393,1394],{"class":1055,"line":1087},[1053,1395,1077],{"emptyLinePlaceholder":1076},[1053,1397,1398,1401,1405,1408,1411,1414,1417],{"class":1055,"line":1147},[1053,1399,1400],{"class":1059},"class",[1053,1402,1404],{"class":1403},"snPdu"," SimpleCNN",[1053,1406,1407],{"class":1063},"(",[1053,1409,1410],{"class":1403},"nn",[1053,1412,1413],{"class":1063},".",[1053,1415,1416],{"class":1403},"Module",[1053,1418,1419],{"class":1063},"):\n",[1053,1421,1422,1425,1428,1431,1433,1436],{"class":1055,"line":1152},[1053,1423,1424],{"class":1059},"    def",[1053,1426,1427],{"class":1105}," __init__",[1053,1429,1430],{"class":1063},"(self, num_classes",[1053,1432,1093],{"class":1059},[1053,1434,1435],{"class":1105},"10",[1053,1437,1419],{"class":1063},[1053,1439,1440,1443,1446,1449],{"class":1055,"line":1158},[1053,1441,1442],{"class":1105},"        super",[1053,1444,1445],{"class":1063},"().",[1053,1447,1448],{"class":1105},"__init__",[1053,1450,1451],{"class":1063},"()\n",[1053,1453,1455],{"class":1055,"line":1454},8,[1053,1456,1457],{"class":1083},"        # 特征提取部分\n",[1053,1459,1461,1464,1467,1469],{"class":1055,"line":1460},9,[1053,1462,1463],{"class":1105},"        self",[1053,1465,1466],{"class":1063},".features ",[1053,1468,1093],{"class":1059},[1053,1470,1471],{"class":1063}," nn.Sequential(\n",[1053,1473,1475,1478,1480,1482,1485,1487,1489,1491,1493,1495,1497,1499,1501,1504],{"class":1055,"line":1474},10,[1053,1476,1477],{"class":1063},"            nn.Conv2d(",[1053,1479,1133],{"class":1105},[1053,1481,1109],{"class":1063},[1053,1483,1484],{"class":1105},"32",[1053,1486,1109],{"class":1063},[1053,1488,1001],{"class":1099},[1053,1490,1093],{"class":1059},[1053,1492,1106],{"class":1105},[1053,1494,1109],{"class":1063},[1053,1496,1023],{"class":1099},[1053,1498,1093],{"class":1059},[1053,1500,1133],{"class":1105},[1053,1502,1503],{"class":1063},"),   ",[1053,1505,1506],{"class":1083},"# 28×28×1 → 28×28×32\n",[1053,1508,1510],{"class":1055,"line":1509},11,[1053,1511,1512],{"class":1063},"            nn.ReLU(),\n",[1053,1514,1516,1519,1521,1524],{"class":1055,"line":1515},12,[1053,1517,1518],{"class":1063},"            nn.MaxPool2d(",[1053,1520,1209],{"class":1105},[1053,1522,1523],{"class":1063},"),                               ",[1053,1525,1526],{"class":1083},"# 28×28×32 → 14×14×32\n",[1053,1528,1530],{"class":1055,"line":1529},13,[1053,1531,1077],{"emptyLinePlaceholder":1076},[1053,1533,1535,1537,1539,1541,1543,1545,1547,1549,1551,1553,1555,1557,1559,1561],{"class":1055,"line":1534},14,[1053,1536,1477],{"class":1063},[1053,1538,1484],{"class":1105},[1053,1540,1109],{"class":1063},[1053,1542,1116],{"class":1105},[1053,1544,1109],{"class":1063},[1053,1546,1001],{"class":1099},[1053,1548,1093],{"class":1059},[1053,1550,1106],{"class":1105},[1053,1552,1109],{"class":1063},[1053,1554,1023],{"class":1099},[1053,1556,1093],{"class":1059},[1053,1558,1133],{"class":1105},[1053,1560,1503],{"class":1063},[1053,1562,1563],{"class":1083},"# 14×14×32 → 14×14×64\n",[1053,1565,1567],{"class":1055,"line":1566},15,[1053,1568,1512],{"class":1063},[1053,1570,1572,1574,1576,1578],{"class":1055,"line":1571},16,[1053,1573,1518],{"class":1063},[1053,1575,1209],{"class":1105},[1053,1577,1523],{"class":1063},[1053,1579,1580],{"class":1083},"# 14×14×64 → 7×7×64\n",[1053,1582,1584],{"class":1055,"line":1583},17,[1053,1585,1586],{"class":1063},"        )\n",[1053,1588,1590],{"class":1055,"line":1589},18,[1053,1591,1592],{"class":1083},"        # 分类部分\n",[1053,1594,1596,1598,1601,1603],{"class":1055,"line":1595},19,[1053,1597,1463],{"class":1105},[1053,1599,1600],{"class":1063},".classifier ",[1053,1602,1093],{"class":1059},[1053,1604,1471],{"class":1063},[1053,1606,1608],{"class":1055,"line":1607},20,[1053,1609,1610],{"class":1063},"            nn.Flatten(),\n",[1053,1612,1614,1617,1619,1622,1625,1627,1629,1631,1634],{"class":1055,"line":1613},21,[1053,1615,1616],{"class":1063},"            nn.Linear(",[1053,1618,1116],{"class":1105},[1053,1620,1621],{"class":1059}," *",[1053,1623,1624],{"class":1105}," 7",[1053,1626,1621],{"class":1059},[1053,1628,1624],{"class":1105},[1053,1630,1109],{"class":1063},[1053,1632,1633],{"class":1105},"128",[1053,1635,1636],{"class":1063},"),\n",[1053,1638,1640],{"class":1055,"line":1639},22,[1053,1641,1512],{"class":1063},[1053,1643,1645,1648,1651],{"class":1055,"line":1644},23,[1053,1646,1647],{"class":1063},"            nn.Dropout(",[1053,1649,1650],{"class":1105},"0.5",[1053,1652,1636],{"class":1063},[1053,1654,1656,1658,1660],{"class":1055,"line":1655},24,[1053,1657,1616],{"class":1063},[1053,1659,1633],{"class":1105},[1053,1661,1662],{"class":1063},", num_classes)\n",[1053,1664,1666],{"class":1055,"line":1665},25,[1053,1667,1586],{"class":1063},[1053,1669,1671],{"class":1055,"line":1670},26,[1053,1672,1077],{"emptyLinePlaceholder":1076},[1053,1674,1676,1678,1681],{"class":1055,"line":1675},27,[1053,1677,1424],{"class":1059},[1053,1679,1680],{"class":1403}," forward",[1053,1682,1683],{"class":1063},"(self, x):\n",[1053,1685,1687,1690,1692,1695],{"class":1055,"line":1686},28,[1053,1688,1689],{"class":1063},"        x ",[1053,1691,1093],{"class":1059},[1053,1693,1694],{"class":1105}," self",[1053,1696,1697],{"class":1063},".features(x)\n",[1053,1699,1701,1703,1705,1707],{"class":1055,"line":1700},29,[1053,1702,1689],{"class":1063},[1053,1704,1093],{"class":1059},[1053,1706,1694],{"class":1105},[1053,1708,1709],{"class":1063},".classifier(x)\n",[1053,1711,1713,1716],{"class":1055,"line":1712},30,[1053,1714,1715],{"class":1059},"        return",[1053,1717,1718],{"class":1063}," x\n",[1053,1720,1722],{"class":1055,"line":1721},31,[1053,1723,1077],{"emptyLinePlaceholder":1076},[1053,1725,1727,1730,1732],{"class":1055,"line":1726},32,[1053,1728,1729],{"class":1063},"model ",[1053,1731,1093],{"class":1059},[1053,1733,1734],{"class":1063}," SimpleCNN()\n",[1053,1736,1738],{"class":1055,"line":1737},33,[1053,1739,1740],{"class":1083},"# 测试前向传播\n",[1053,1742,1744,1747,1749,1752,1754,1756,1758,1760,1763,1765,1767],{"class":1055,"line":1743},34,[1053,1745,1746],{"class":1063},"sample ",[1053,1748,1093],{"class":1059},[1053,1750,1751],{"class":1063}," torch.randn(",[1053,1753,1133],{"class":1105},[1053,1755,1109],{"class":1063},[1053,1757,1133],{"class":1105},[1053,1759,1109],{"class":1063},[1053,1761,1762],{"class":1105},"28",[1053,1764,1109],{"class":1063},[1053,1766,1762],{"class":1105},[1053,1768,1144],{"class":1063},[1053,1770,1772,1775,1777],{"class":1055,"line":1771},35,[1053,1773,1774],{"class":1063},"output ",[1053,1776,1093],{"class":1059},[1053,1778,1779],{"class":1063}," model(sample)\n",[1053,1781,1783,1786,1788,1791,1795,1798,1801,1804,1807,1810],{"class":1055,"line":1782},36,[1053,1784,1785],{"class":1105},"print",[1053,1787,1407],{"class":1063},[1053,1789,1790],{"class":1059},"f",[1053,1792,1794],{"class":1793},"sIIMD","\"输出形状: ",[1053,1796,1797],{"class":1105},"{",[1053,1799,1800],{"class":1063},"output.shape",[1053,1802,1803],{"class":1105},"}",[1053,1805,1806],{"class":1793},"\"",[1053,1808,1809],{"class":1063},")  ",[1053,1811,1812],{"class":1083},"# torch.Size([1, 10])\n",[892,1814,1816],{"id":1815},"循环神经网络rnn","循环神经网络（RNN）",[896,1818,1819],{},"RNN 专为处理序列数据设计，通过隐藏状态在时间步之间传递信息，使网络具有\"记忆\"能力。",[927,1821,1823],{"id":1822},"基本-rnn","基本 RNN",[896,1825,1826],{},"在每个时间步 t，RNN 接收当前输入 x_t 和上一时刻的隐藏状态 h_(t-1)，计算新的隐藏状态：",[896,1828,1829],{},"$$h_t = tanh(W_ x_t + W_ h_ + b)$$",[900,1831,1834],{"className":1832,"code":1833,"language":905,"meta":906},[903],"flowchart LR\n    X0[\"x0 #40;我#41;\"] --> R0[\"RNN\"] --> H0[\"h0\"]\n    X1[\"x1 #40;喜欢#41;\"] --> R1[\"RNN\"] --> H1[\"h1\"]\n    X2[\"x2 #40;机器#41;\"] --> R2[\"RNN\"] --> H2[\"h2\"]\n    X3[\"x3 #40;学习#41;\"] --> R3[\"RNN\"] --> H3[\"h3\"]\n    R0 --> R1 --> R2 --> R3 --> More[\"...\"]\n",[908,1835,1833],{"__ignoreMap":11},[900,1837,1839],{"className":1047,"code":1838,"language":1049,"meta":11,"style":11},"import torch.nn as nn\n\n# 基本 RNN\nrnn = nn.RNN(input_size=128, hidden_size=256, num_layers=2, batch_first=True)\n\n# 输入：batch_size=32, 序列长度=50, 每个 token 的维度=128\nx = torch.randn(32, 50, 128)\noutput, hidden = rnn(x)\n\nprint(f\"输出形状: {output.shape}\")   # (32, 50, 256) - 每个时间步的隐藏状态\nprint(f\"隐藏状态: {hidden.shape}\")   # (2, 32, 256) - 最后时间步的隐藏状态\n",[908,1840,1841,1851,1855,1860,1908,1912,1917,1939,1949,1953,1977],{"__ignoreMap":11},[1053,1842,1843,1845,1847,1849],{"class":1055,"line":1056},[1053,1844,1060],{"class":1059},[1053,1846,1064],{"class":1063},[1053,1848,1067],{"class":1059},[1053,1850,1070],{"class":1063},[1053,1852,1853],{"class":1055,"line":1073},[1053,1854,1077],{"emptyLinePlaceholder":1076},[1053,1856,1857],{"class":1055,"line":1080},[1053,1858,1859],{"class":1083},"# 基本 RNN\n",[1053,1861,1862,1865,1867,1870,1873,1875,1877,1879,1882,1884,1887,1889,1892,1894,1896,1898,1901,1903,1906],{"class":1055,"line":1087},[1053,1863,1864],{"class":1063},"rnn ",[1053,1866,1093],{"class":1059},[1053,1868,1869],{"class":1063}," nn.RNN(",[1053,1871,1872],{"class":1099},"input_size",[1053,1874,1093],{"class":1059},[1053,1876,1633],{"class":1105},[1053,1878,1109],{"class":1063},[1053,1880,1881],{"class":1099},"hidden_size",[1053,1883,1093],{"class":1059},[1053,1885,1886],{"class":1105},"256",[1053,1888,1109],{"class":1063},[1053,1890,1891],{"class":1099},"num_layers",[1053,1893,1093],{"class":1059},[1053,1895,1209],{"class":1105},[1053,1897,1109],{"class":1063},[1053,1899,1900],{"class":1099},"batch_first",[1053,1902,1093],{"class":1059},[1053,1904,1905],{"class":1105},"True",[1053,1907,1144],{"class":1063},[1053,1909,1910],{"class":1055,"line":1147},[1053,1911,1077],{"emptyLinePlaceholder":1076},[1053,1913,1914],{"class":1055,"line":1152},[1053,1915,1916],{"class":1083},"# 输入：batch_size=32, 序列长度=50, 每个 token 的维度=128\n",[1053,1918,1919,1922,1924,1926,1928,1930,1933,1935,1937],{"class":1055,"line":1158},[1053,1920,1921],{"class":1063},"x ",[1053,1923,1093],{"class":1059},[1053,1925,1751],{"class":1063},[1053,1927,1484],{"class":1105},[1053,1929,1109],{"class":1063},[1053,1931,1932],{"class":1105},"50",[1053,1934,1109],{"class":1063},[1053,1936,1633],{"class":1105},[1053,1938,1144],{"class":1063},[1053,1940,1941,1944,1946],{"class":1055,"line":1454},[1053,1942,1943],{"class":1063},"output, hidden ",[1053,1945,1093],{"class":1059},[1053,1947,1948],{"class":1063}," rnn(x)\n",[1053,1950,1951],{"class":1055,"line":1460},[1053,1952,1077],{"emptyLinePlaceholder":1076},[1053,1954,1955,1957,1959,1961,1963,1965,1967,1969,1971,1974],{"class":1055,"line":1474},[1053,1956,1785],{"class":1105},[1053,1958,1407],{"class":1063},[1053,1960,1790],{"class":1059},[1053,1962,1794],{"class":1793},[1053,1964,1797],{"class":1105},[1053,1966,1800],{"class":1063},[1053,1968,1803],{"class":1105},[1053,1970,1806],{"class":1793},[1053,1972,1973],{"class":1063},")   ",[1053,1975,1976],{"class":1083},"# (32, 50, 256) - 每个时间步的隐藏状态\n",[1053,1978,1979,1981,1983,1985,1988,1990,1993,1995,1997,1999],{"class":1055,"line":1509},[1053,1980,1785],{"class":1105},[1053,1982,1407],{"class":1063},[1053,1984,1790],{"class":1059},[1053,1986,1987],{"class":1793},"\"隐藏状态: ",[1053,1989,1797],{"class":1105},[1053,1991,1992],{"class":1063},"hidden.shape",[1053,1994,1803],{"class":1105},[1053,1996,1806],{"class":1793},[1053,1998,1973],{"class":1063},[1053,2000,2001],{"class":1083},"# (2, 32, 256) - 最后时间步的隐藏状态\n",[2003,2004,2005],"warning",{},"\n基本 RNN 存在严重的**梯度消失**问题：当序列很长时，早期时间步的信息在反向传播中逐渐衰减，导致模型无法学习长距离依赖。在实际应用中应使用 LSTM 或 GRU 替代。\n",[927,2007,2009],{"id":2008},"lstm长短期记忆网络","LSTM（长短期记忆网络）",[896,2011,2012,2013,2016],{},"LSTM 通过引入",[918,2014,2015],{},"门控机制","（遗忘门、输入门、输出门）和独立的细胞状态来解决长距离依赖问题。",[900,2018,2021],{"className":2019,"code":2020,"language":905,"meta":906},[903],"flowchart LR\n    Input[\"#91;h_{t-1}, x_t#93;\"] --> Cell[\"LSTM Cell\"]\n    Forget[\"遗忘门\u003Cbr\u002F>#40;forget#41;\"] --> Cell\n    InGate[\"输入门\u003Cbr\u002F>#40;input#41;\"] --> Cell\n    C1[\"细胞状态 C\u003Cbr\u002F>#40;信息高速公路#41;\"] --> Cell --> C2[\"细胞状态 C\"]\n    Cell --> Ht[\"h_t\u003Cbr\u002F>#40;输出门控制#41;\"]\n",[908,2022,2020],{"__ignoreMap":11},[896,2024,2025],{},"三个门的作用：",[975,2027,2028,2041],{},[978,2029,2030],{},[981,2031,2032,2035,2038],{},[984,2033,2034],{},"门",[984,2036,2037],{},"功能",[984,2039,2040],{},"直觉理解",[994,2042,2043,2054,2065],{},[981,2044,2045,2048,2051],{},[999,2046,2047],{},"遗忘门（Forget Gate）",[999,2049,2050],{},"决定丢弃哪些旧信息",[999,2052,2053],{},"\"忘掉不重要的\"",[981,2055,2056,2059,2062],{},[999,2057,2058],{},"输入门（Input Gate）",[999,2060,2061],{},"决定存储哪些新信息",[999,2063,2064],{},"\"记住重要的新内容\"",[981,2066,2067,2070,2073],{},[999,2068,2069],{},"输出门（Output Gate）",[999,2071,2072],{},"决定输出哪些信息",[999,2074,2075],{},"\"挑选当前需要的\"",[900,2077,2079],{"className":1047,"code":2078,"language":1049,"meta":11,"style":11},"# LSTM\nlstm = nn.LSTM(input_size=128, hidden_size=256, num_layers=2,\n               batch_first=True, dropout=0.2, bidirectional=True)\n\nx = torch.randn(32, 50, 128)\noutput, (hidden, cell) = lstm(x)\n\n# 双向 LSTM 的输出维度是 hidden_size × 2\nprint(f\"输出形状: {output.shape}\")   # (32, 50, 512)\nprint(f\"隐藏状态: {hidden.shape}\")   # (4, 32, 256) - 2 layers × 2 directions\n",[908,2080,2081,2086,2121,2151,2155,2175,2185,2189,2194,2217],{"__ignoreMap":11},[1053,2082,2083],{"class":1055,"line":1056},[1053,2084,2085],{"class":1083},"# LSTM\n",[1053,2087,2088,2091,2093,2096,2098,2100,2102,2104,2106,2108,2110,2112,2114,2116,2118],{"class":1055,"line":1073},[1053,2089,2090],{"class":1063},"lstm ",[1053,2092,1093],{"class":1059},[1053,2094,2095],{"class":1063}," nn.LSTM(",[1053,2097,1872],{"class":1099},[1053,2099,1093],{"class":1059},[1053,2101,1633],{"class":1105},[1053,2103,1109],{"class":1063},[1053,2105,1881],{"class":1099},[1053,2107,1093],{"class":1059},[1053,2109,1886],{"class":1105},[1053,2111,1109],{"class":1063},[1053,2113,1891],{"class":1099},[1053,2115,1093],{"class":1059},[1053,2117,1209],{"class":1105},[1053,2119,2120],{"class":1063},",\n",[1053,2122,2123,2126,2128,2130,2132,2135,2137,2140,2142,2145,2147,2149],{"class":1055,"line":1080},[1053,2124,2125],{"class":1099},"               batch_first",[1053,2127,1093],{"class":1059},[1053,2129,1905],{"class":1105},[1053,2131,1109],{"class":1063},[1053,2133,2134],{"class":1099},"dropout",[1053,2136,1093],{"class":1059},[1053,2138,2139],{"class":1105},"0.2",[1053,2141,1109],{"class":1063},[1053,2143,2144],{"class":1099},"bidirectional",[1053,2146,1093],{"class":1059},[1053,2148,1905],{"class":1105},[1053,2150,1144],{"class":1063},[1053,2152,2153],{"class":1055,"line":1087},[1053,2154,1077],{"emptyLinePlaceholder":1076},[1053,2156,2157,2159,2161,2163,2165,2167,2169,2171,2173],{"class":1055,"line":1147},[1053,2158,1921],{"class":1063},[1053,2160,1093],{"class":1059},[1053,2162,1751],{"class":1063},[1053,2164,1484],{"class":1105},[1053,2166,1109],{"class":1063},[1053,2168,1932],{"class":1105},[1053,2170,1109],{"class":1063},[1053,2172,1633],{"class":1105},[1053,2174,1144],{"class":1063},[1053,2176,2177,2180,2182],{"class":1055,"line":1152},[1053,2178,2179],{"class":1063},"output, (hidden, cell) ",[1053,2181,1093],{"class":1059},[1053,2183,2184],{"class":1063}," lstm(x)\n",[1053,2186,2187],{"class":1055,"line":1158},[1053,2188,1077],{"emptyLinePlaceholder":1076},[1053,2190,2191],{"class":1055,"line":1454},[1053,2192,2193],{"class":1083},"# 双向 LSTM 的输出维度是 hidden_size × 2\n",[1053,2195,2196,2198,2200,2202,2204,2206,2208,2210,2212,2214],{"class":1055,"line":1460},[1053,2197,1785],{"class":1105},[1053,2199,1407],{"class":1063},[1053,2201,1790],{"class":1059},[1053,2203,1794],{"class":1793},[1053,2205,1797],{"class":1105},[1053,2207,1800],{"class":1063},[1053,2209,1803],{"class":1105},[1053,2211,1806],{"class":1793},[1053,2213,1973],{"class":1063},[1053,2215,2216],{"class":1083},"# (32, 50, 512)\n",[1053,2218,2219,2221,2223,2225,2227,2229,2231,2233,2235,2237],{"class":1055,"line":1474},[1053,2220,1785],{"class":1105},[1053,2222,1407],{"class":1063},[1053,2224,1790],{"class":1059},[1053,2226,1987],{"class":1793},[1053,2228,1797],{"class":1105},[1053,2230,1992],{"class":1063},[1053,2232,1803],{"class":1105},[1053,2234,1806],{"class":1793},[1053,2236,1973],{"class":1063},[1053,2238,2239],{"class":1083},"# (4, 32, 256) - 2 layers × 2 directions\n",[927,2241,2243],{"id":2242},"gru门控循环单元","GRU（门控循环单元）",[896,2245,2246,2247,2250,2251,2254],{},"GRU 是 LSTM 的简化版本，将遗忘门和输入门合并为",[918,2248,2249],{},"更新门","，并引入",[918,2252,2253],{},"重置门","。参数更少，训练更快，效果通常与 LSTM 相当。",[900,2256,2258],{"className":1047,"code":2257,"language":1049,"meta":11,"style":11},"# GRU\ngru = nn.GRU(input_size=128, hidden_size=256, num_layers=2,\n             batch_first=True, dropout=0.2)\n\nx = torch.randn(32, 50, 128)\noutput, hidden = gru(x)\nprint(f\"输出形状: {output.shape}\")   # (32, 50, 256)\n",[908,2259,2260,2265,2299,2318,2322,2342,2351],{"__ignoreMap":11},[1053,2261,2262],{"class":1055,"line":1056},[1053,2263,2264],{"class":1083},"# GRU\n",[1053,2266,2267,2270,2272,2275,2277,2279,2281,2283,2285,2287,2289,2291,2293,2295,2297],{"class":1055,"line":1073},[1053,2268,2269],{"class":1063},"gru ",[1053,2271,1093],{"class":1059},[1053,2273,2274],{"class":1063}," nn.GRU(",[1053,2276,1872],{"class":1099},[1053,2278,1093],{"class":1059},[1053,2280,1633],{"class":1105},[1053,2282,1109],{"class":1063},[1053,2284,1881],{"class":1099},[1053,2286,1093],{"class":1059},[1053,2288,1886],{"class":1105},[1053,2290,1109],{"class":1063},[1053,2292,1891],{"class":1099},[1053,2294,1093],{"class":1059},[1053,2296,1209],{"class":1105},[1053,2298,2120],{"class":1063},[1053,2300,2301,2304,2306,2308,2310,2312,2314,2316],{"class":1055,"line":1080},[1053,2302,2303],{"class":1099},"             batch_first",[1053,2305,1093],{"class":1059},[1053,2307,1905],{"class":1105},[1053,2309,1109],{"class":1063},[1053,2311,2134],{"class":1099},[1053,2313,1093],{"class":1059},[1053,2315,2139],{"class":1105},[1053,2317,1144],{"class":1063},[1053,2319,2320],{"class":1055,"line":1087},[1053,2321,1077],{"emptyLinePlaceholder":1076},[1053,2323,2324,2326,2328,2330,2332,2334,2336,2338,2340],{"class":1055,"line":1147},[1053,2325,1921],{"class":1063},[1053,2327,1093],{"class":1059},[1053,2329,1751],{"class":1063},[1053,2331,1484],{"class":1105},[1053,2333,1109],{"class":1063},[1053,2335,1932],{"class":1105},[1053,2337,1109],{"class":1063},[1053,2339,1633],{"class":1105},[1053,2341,1144],{"class":1063},[1053,2343,2344,2346,2348],{"class":1055,"line":1152},[1053,2345,1943],{"class":1063},[1053,2347,1093],{"class":1059},[1053,2349,2350],{"class":1063}," gru(x)\n",[1053,2352,2353,2355,2357,2359,2361,2363,2365,2367,2369,2371],{"class":1055,"line":1158},[1053,2354,1785],{"class":1105},[1053,2356,1407],{"class":1063},[1053,2358,1790],{"class":1059},[1053,2360,1794],{"class":1793},[1053,2362,1797],{"class":1105},[1053,2364,1800],{"class":1063},[1053,2366,1803],{"class":1105},[1053,2368,1806],{"class":1793},[1053,2370,1973],{"class":1063},[1053,2372,2373],{"class":1083},"# (32, 50, 256)\n",[927,2375,2377],{"id":2376},"rnn-变体对比","RNN 变体对比",[975,2379,2380,2399],{},[978,2381,2382],{},[981,2383,2384,2387,2390,2393,2396],{},[984,2385,2386],{},"模型",[984,2388,2389],{},"参数量",[984,2391,2392],{},"长距离依赖",[984,2394,2395],{},"训练速度",[984,2397,2398],{},"推荐程度",[994,2400,2401,2418,2435],{},[981,2402,2403,2406,2409,2412,2415],{},[999,2404,2405],{},"Vanilla RNN",[999,2407,2408],{},"少",[999,2410,2411],{},"差",[999,2413,2414],{},"快",[999,2416,2417],{},"不推荐",[981,2419,2420,2423,2426,2429,2432],{},[999,2421,2422],{},"LSTM",[999,2424,2425],{},"多（4 倍于 RNN）",[999,2427,2428],{},"好",[999,2430,2431],{},"慢",[999,2433,2434],{},"推荐",[981,2436,2437,2440,2443,2445,2448],{},[999,2438,2439],{},"GRU",[999,2441,2442],{},"中（3 倍于 RNN）",[999,2444,2428],{},[999,2446,2447],{},"较快",[999,2449,2434],{},[2451,2452,2453],"tip",{},"\n在大多数场景下，GRU 和 LSTM 效果差异不大。如果计算资源有限或序列不太长，优先尝试 GRU；如果任务对长距离依赖很敏感（如长文档理解），LSTM 可能更稳健。\n",[892,2455,2457],{"id":2456},"注意力机制attention-mechanism","注意力机制（Attention Mechanism）",[896,2459,2460],{},"注意力机制是近年来最重要的深度学习创新，也是 Transformer 架构的核心。它允许模型在处理某个位置时，动态关注输入序列中最相关的部分。",[927,2462,2463],{"id":2463},"为什么需要注意力",[896,2465,2466],{},"RNN\u002FLSTM 通过固定长度的隐藏状态来压缩整个序列的信息，这成为信息瓶颈。对于长序列，早期的信息仍可能丢失。注意力机制让模型可以\"直接回看\"输入序列的任意位置。",[927,2468,2469],{"id":2469},"注意力的计算过程",[896,2471,2472,2473,2476,2477,2476,2480,2483],{},"注意力的核心是三个概念：",[918,2474,2475],{},"Query（查询）","、",[918,2478,2479],{},"Key（键）",[918,2481,2482],{},"Value（值）","。",[900,2485,2488],{"className":2486,"code":2487,"language":905},[903],"计算过程：\n1. 计算 Query 和每个 Key 的相似度（点积）\n2. 通过 Softmax 将相似度转为权重（和为 1）\n3. 用权重对 Value 做加权求和，得到输出\n\nAttention(Q, K, V) = softmax(Q × K^T \u002F √d_k) × V\n",[908,2489,2487],{"__ignoreMap":11},[900,2491,2493],{"className":1047,"code":2492,"language":1049,"meta":11,"style":11},"import torch\nimport torch.nn.functional as F\nimport math\n\ndef scaled_dot_product_attention(query, key, value, mask=None):\n    \"\"\"缩放点积注意力\"\"\"\n    d_k = query.size(-1)\n\n    # 计算注意力分数\n    scores = torch.matmul(query, key.transpose(-2, -1)) \u002F math.sqrt(d_k)\n\n    # 可选的掩码（用于解码器中屏蔽未来位置）\n    if mask is not None:\n        scores = scores.masked_fill(mask == 0, float('-inf'))\n\n    # Softmax 归一化为权重\n    attention_weights = F.softmax(scores, dim=-1)\n\n    # 加权求和\n    output = torch.matmul(attention_weights, value)\n    return output, attention_weights\n\n# 示例\nseq_len, d_model = 10, 64\nQ = torch.randn(1, seq_len, d_model)\nK = torch.randn(1, seq_len, d_model)\nV = torch.randn(1, seq_len, d_model)\n\noutput, weights = scaled_dot_product_attention(Q, K, V)\nprint(f\"输出形状: {output.shape}\")           # (1, 10, 64)\nprint(f\"注意力权重形状: {weights.shape}\")     # (1, 10, 10)\n",[908,2494,2495,2501,2511,2518,2522,2540,2545,2562,2566,2571,2600,2604,2609,2629,2658,2662,2667,2687,2691,2696,2706,2714,2718,2723,2738,2752,2765,2778,2782,2792,2816],{"__ignoreMap":11},[1053,2496,2497,2499],{"class":1055,"line":1056},[1053,2498,1060],{"class":1059},[1053,2500,1369],{"class":1063},[1053,2502,2503,2505,2507,2509],{"class":1055,"line":1073},[1053,2504,1060],{"class":1059},[1053,2506,1386],{"class":1063},[1053,2508,1067],{"class":1059},[1053,2510,1391],{"class":1063},[1053,2512,2513,2515],{"class":1055,"line":1080},[1053,2514,1060],{"class":1059},[1053,2516,2517],{"class":1063}," math\n",[1053,2519,2520],{"class":1055,"line":1087},[1053,2521,1077],{"emptyLinePlaceholder":1076},[1053,2523,2524,2527,2530,2533,2535,2538],{"class":1055,"line":1147},[1053,2525,2526],{"class":1059},"def",[1053,2528,2529],{"class":1403}," scaled_dot_product_attention",[1053,2531,2532],{"class":1063},"(query, key, value, mask",[1053,2534,1093],{"class":1059},[1053,2536,2537],{"class":1105},"None",[1053,2539,1419],{"class":1063},[1053,2541,2542],{"class":1055,"line":1152},[1053,2543,2544],{"class":1793},"    \"\"\"缩放点积注意力\"\"\"\n",[1053,2546,2547,2550,2552,2555,2558,2560],{"class":1055,"line":1158},[1053,2548,2549],{"class":1063},"    d_k ",[1053,2551,1093],{"class":1059},[1053,2553,2554],{"class":1063}," query.size(",[1053,2556,2557],{"class":1059},"-",[1053,2559,1133],{"class":1105},[1053,2561,1144],{"class":1063},[1053,2563,2564],{"class":1055,"line":1454},[1053,2565,1077],{"emptyLinePlaceholder":1076},[1053,2567,2568],{"class":1055,"line":1460},[1053,2569,2570],{"class":1083},"    # 计算注意力分数\n",[1053,2572,2573,2576,2578,2581,2583,2585,2587,2589,2591,2594,2597],{"class":1055,"line":1474},[1053,2574,2575],{"class":1063},"    scores ",[1053,2577,1093],{"class":1059},[1053,2579,2580],{"class":1063}," torch.matmul(query, key.transpose(",[1053,2582,2557],{"class":1059},[1053,2584,1209],{"class":1105},[1053,2586,1109],{"class":1063},[1053,2588,2557],{"class":1059},[1053,2590,1133],{"class":1105},[1053,2592,2593],{"class":1063},")) ",[1053,2595,2596],{"class":1059},"\u002F",[1053,2598,2599],{"class":1063}," math.sqrt(d_k)\n",[1053,2601,2602],{"class":1055,"line":1509},[1053,2603,1077],{"emptyLinePlaceholder":1076},[1053,2605,2606],{"class":1055,"line":1515},[1053,2607,2608],{"class":1083},"    # 可选的掩码（用于解码器中屏蔽未来位置）\n",[1053,2610,2611,2614,2617,2620,2623,2626],{"class":1055,"line":1529},[1053,2612,2613],{"class":1059},"    if",[1053,2615,2616],{"class":1063}," mask ",[1053,2618,2619],{"class":1059},"is",[1053,2621,2622],{"class":1059}," not",[1053,2624,2625],{"class":1105}," None",[1053,2627,2628],{"class":1063},":\n",[1053,2630,2631,2634,2636,2639,2642,2645,2647,2650,2652,2655],{"class":1055,"line":1534},[1053,2632,2633],{"class":1063},"        scores ",[1053,2635,1093],{"class":1059},[1053,2637,2638],{"class":1063}," scores.masked_fill(mask ",[1053,2640,2641],{"class":1059},"==",[1053,2643,2644],{"class":1105}," 0",[1053,2646,1109],{"class":1063},[1053,2648,2649],{"class":1105},"float",[1053,2651,1407],{"class":1063},[1053,2653,2654],{"class":1793},"'-inf'",[1053,2656,2657],{"class":1063},"))\n",[1053,2659,2660],{"class":1055,"line":1566},[1053,2661,1077],{"emptyLinePlaceholder":1076},[1053,2663,2664],{"class":1055,"line":1571},[1053,2665,2666],{"class":1083},"    # Softmax 归一化为权重\n",[1053,2668,2669,2672,2674,2677,2680,2683,2685],{"class":1055,"line":1583},[1053,2670,2671],{"class":1063},"    attention_weights ",[1053,2673,1093],{"class":1059},[1053,2675,2676],{"class":1063}," F.softmax(scores, ",[1053,2678,2679],{"class":1099},"dim",[1053,2681,2682],{"class":1059},"=-",[1053,2684,1133],{"class":1105},[1053,2686,1144],{"class":1063},[1053,2688,2689],{"class":1055,"line":1589},[1053,2690,1077],{"emptyLinePlaceholder":1076},[1053,2692,2693],{"class":1055,"line":1595},[1053,2694,2695],{"class":1083},"    # 加权求和\n",[1053,2697,2698,2701,2703],{"class":1055,"line":1607},[1053,2699,2700],{"class":1063},"    output ",[1053,2702,1093],{"class":1059},[1053,2704,2705],{"class":1063}," torch.matmul(attention_weights, value)\n",[1053,2707,2708,2711],{"class":1055,"line":1613},[1053,2709,2710],{"class":1059},"    return",[1053,2712,2713],{"class":1063}," output, attention_weights\n",[1053,2715,2716],{"class":1055,"line":1639},[1053,2717,1077],{"emptyLinePlaceholder":1076},[1053,2719,2720],{"class":1055,"line":1644},[1053,2721,2722],{"class":1083},"# 示例\n",[1053,2724,2725,2728,2730,2733,2735],{"class":1055,"line":1655},[1053,2726,2727],{"class":1063},"seq_len, d_model ",[1053,2729,1093],{"class":1059},[1053,2731,2732],{"class":1105}," 10",[1053,2734,1109],{"class":1063},[1053,2736,2737],{"class":1105},"64\n",[1053,2739,2740,2743,2745,2747,2749],{"class":1055,"line":1665},[1053,2741,2742],{"class":1063},"Q ",[1053,2744,1093],{"class":1059},[1053,2746,1751],{"class":1063},[1053,2748,1133],{"class":1105},[1053,2750,2751],{"class":1063},", seq_len, d_model)\n",[1053,2753,2754,2757,2759,2761,2763],{"class":1055,"line":1670},[1053,2755,2756],{"class":1063},"K ",[1053,2758,1093],{"class":1059},[1053,2760,1751],{"class":1063},[1053,2762,1133],{"class":1105},[1053,2764,2751],{"class":1063},[1053,2766,2767,2770,2772,2774,2776],{"class":1055,"line":1675},[1053,2768,2769],{"class":1063},"V ",[1053,2771,1093],{"class":1059},[1053,2773,1751],{"class":1063},[1053,2775,1133],{"class":1105},[1053,2777,2751],{"class":1063},[1053,2779,2780],{"class":1055,"line":1686},[1053,2781,1077],{"emptyLinePlaceholder":1076},[1053,2783,2784,2787,2789],{"class":1055,"line":1700},[1053,2785,2786],{"class":1063},"output, weights ",[1053,2788,1093],{"class":1059},[1053,2790,2791],{"class":1063}," scaled_dot_product_attention(Q, K, V)\n",[1053,2793,2794,2796,2798,2800,2802,2804,2806,2808,2810,2813],{"class":1055,"line":1712},[1053,2795,1785],{"class":1105},[1053,2797,1407],{"class":1063},[1053,2799,1790],{"class":1059},[1053,2801,1794],{"class":1793},[1053,2803,1797],{"class":1105},[1053,2805,1800],{"class":1063},[1053,2807,1803],{"class":1105},[1053,2809,1806],{"class":1793},[1053,2811,2812],{"class":1063},")           ",[1053,2814,2815],{"class":1083},"# (1, 10, 64)\n",[1053,2817,2818,2820,2822,2824,2827,2829,2832,2834,2836,2839],{"class":1055,"line":1721},[1053,2819,1785],{"class":1105},[1053,2821,1407],{"class":1063},[1053,2823,1790],{"class":1059},[1053,2825,2826],{"class":1793},"\"注意力权重形状: ",[1053,2828,1797],{"class":1105},[1053,2830,2831],{"class":1063},"weights.shape",[1053,2833,1803],{"class":1105},[1053,2835,1806],{"class":1793},[1053,2837,2838],{"class":1063},")     ",[1053,2840,2841],{"class":1083},"# (1, 10, 10)\n",[927,2843,2845],{"id":2844},"多头注意力multi-head-attention","多头注意力（Multi-Head Attention）",[896,2847,2848],{},"多头注意力将 Q、K、V 分成多个\"头\"并行计算注意力，再拼接结果。这让模型能同时关注不同位置的不同类型信息。",[900,2850,2852],{"className":1047,"code":2851,"language":1049,"meta":11,"style":11},"class MultiHeadAttention(nn.Module):\n    def __init__(self, d_model=512, num_heads=8):\n        super().__init__()\n        self.num_heads = num_heads\n        self.d_k = d_model \u002F\u002F num_heads\n\n        self.W_q = nn.Linear(d_model, d_model)\n        self.W_k = nn.Linear(d_model, d_model)\n        self.W_v = nn.Linear(d_model, d_model)\n        self.W_o = nn.Linear(d_model, d_model)\n\n    def forward(self, query, key, value, mask=None):\n        batch_size = query.size(0)\n\n        # 线性投影并拆分为多头\n        Q = self.W_q(query).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)\n        K = self.W_k(key).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)\n        V = self.W_v(value).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)\n\n        # 计算注意力\n        output, _ = scaled_dot_product_attention(Q, K, V, mask)\n\n        # 拼接多头结果\n        output = output.transpose(1, 2).contiguous().view(batch_size, -1, self.num_heads * self.d_k)\n        return self.W_o(output)\n\nmha = MultiHeadAttention(d_model=512, num_heads=8)\nx = torch.randn(2, 20, 512)  # batch=2, 序列长度=20, 维度=512\nout = mha(x, x, x)           # 自注意力：Q=K=V\nprint(f\"多头注意力输出: {out.shape}\")  # (2, 20, 512)\n",[908,2853,2854,2871,2894,2904,2916,2933,2937,2949,2960,2971,2982,2986,3001,3015,3019,3024,3061,3095,3129,3133,3138,3148,3152,3157,3194,3203,3207,3235,3259,3272],{"__ignoreMap":11},[1053,2855,2856,2858,2861,2863,2865,2867,2869],{"class":1055,"line":1056},[1053,2857,1400],{"class":1059},[1053,2859,2860],{"class":1403}," MultiHeadAttention",[1053,2862,1407],{"class":1063},[1053,2864,1410],{"class":1403},[1053,2866,1413],{"class":1063},[1053,2868,1416],{"class":1403},[1053,2870,1419],{"class":1063},[1053,2872,2873,2875,2877,2880,2882,2885,2888,2890,2892],{"class":1055,"line":1073},[1053,2874,1424],{"class":1059},[1053,2876,1427],{"class":1105},[1053,2878,2879],{"class":1063},"(self, d_model",[1053,2881,1093],{"class":1059},[1053,2883,2884],{"class":1105},"512",[1053,2886,2887],{"class":1063},", num_heads",[1053,2889,1093],{"class":1059},[1053,2891,1291],{"class":1105},[1053,2893,1419],{"class":1063},[1053,2895,2896,2898,2900,2902],{"class":1055,"line":1080},[1053,2897,1442],{"class":1105},[1053,2899,1445],{"class":1063},[1053,2901,1448],{"class":1105},[1053,2903,1451],{"class":1063},[1053,2905,2906,2908,2911,2913],{"class":1055,"line":1087},[1053,2907,1463],{"class":1105},[1053,2909,2910],{"class":1063},".num_heads ",[1053,2912,1093],{"class":1059},[1053,2914,2915],{"class":1063}," num_heads\n",[1053,2917,2918,2920,2923,2925,2928,2931],{"class":1055,"line":1147},[1053,2919,1463],{"class":1105},[1053,2921,2922],{"class":1063},".d_k ",[1053,2924,1093],{"class":1059},[1053,2926,2927],{"class":1063}," d_model ",[1053,2929,2930],{"class":1059},"\u002F\u002F",[1053,2932,2915],{"class":1063},[1053,2934,2935],{"class":1055,"line":1152},[1053,2936,1077],{"emptyLinePlaceholder":1076},[1053,2938,2939,2941,2944,2946],{"class":1055,"line":1158},[1053,2940,1463],{"class":1105},[1053,2942,2943],{"class":1063},".W_q ",[1053,2945,1093],{"class":1059},[1053,2947,2948],{"class":1063}," nn.Linear(d_model, d_model)\n",[1053,2950,2951,2953,2956,2958],{"class":1055,"line":1454},[1053,2952,1463],{"class":1105},[1053,2954,2955],{"class":1063},".W_k ",[1053,2957,1093],{"class":1059},[1053,2959,2948],{"class":1063},[1053,2961,2962,2964,2967,2969],{"class":1055,"line":1460},[1053,2963,1463],{"class":1105},[1053,2965,2966],{"class":1063},".W_v ",[1053,2968,1093],{"class":1059},[1053,2970,2948],{"class":1063},[1053,2972,2973,2975,2978,2980],{"class":1055,"line":1474},[1053,2974,1463],{"class":1105},[1053,2976,2977],{"class":1063},".W_o ",[1053,2979,1093],{"class":1059},[1053,2981,2948],{"class":1063},[1053,2983,2984],{"class":1055,"line":1509},[1053,2985,1077],{"emptyLinePlaceholder":1076},[1053,2987,2988,2990,2992,2995,2997,2999],{"class":1055,"line":1515},[1053,2989,1424],{"class":1059},[1053,2991,1680],{"class":1403},[1053,2993,2994],{"class":1063},"(self, query, key, value, mask",[1053,2996,1093],{"class":1059},[1053,2998,2537],{"class":1105},[1053,3000,1419],{"class":1063},[1053,3002,3003,3006,3008,3010,3013],{"class":1055,"line":1529},[1053,3004,3005],{"class":1063},"        batch_size ",[1053,3007,1093],{"class":1059},[1053,3009,2554],{"class":1063},[1053,3011,3012],{"class":1105},"0",[1053,3014,1144],{"class":1063},[1053,3016,3017],{"class":1055,"line":1534},[1053,3018,1077],{"emptyLinePlaceholder":1076},[1053,3020,3021],{"class":1055,"line":1566},[1053,3022,3023],{"class":1083},"        # 线性投影并拆分为多头\n",[1053,3025,3026,3029,3031,3033,3036,3038,3040,3042,3045,3048,3050,3053,3055,3057,3059],{"class":1055,"line":1571},[1053,3027,3028],{"class":1063},"        Q ",[1053,3030,1093],{"class":1059},[1053,3032,1694],{"class":1105},[1053,3034,3035],{"class":1063},".W_q(query).view(batch_size, ",[1053,3037,2557],{"class":1059},[1053,3039,1133],{"class":1105},[1053,3041,1109],{"class":1063},[1053,3043,3044],{"class":1105},"self",[1053,3046,3047],{"class":1063},".num_heads, ",[1053,3049,3044],{"class":1105},[1053,3051,3052],{"class":1063},".d_k).transpose(",[1053,3054,1133],{"class":1105},[1053,3056,1109],{"class":1063},[1053,3058,1209],{"class":1105},[1053,3060,1144],{"class":1063},[1053,3062,3063,3066,3068,3070,3073,3075,3077,3079,3081,3083,3085,3087,3089,3091,3093],{"class":1055,"line":1583},[1053,3064,3065],{"class":1063},"        K ",[1053,3067,1093],{"class":1059},[1053,3069,1694],{"class":1105},[1053,3071,3072],{"class":1063},".W_k(key).view(batch_size, ",[1053,3074,2557],{"class":1059},[1053,3076,1133],{"class":1105},[1053,3078,1109],{"class":1063},[1053,3080,3044],{"class":1105},[1053,3082,3047],{"class":1063},[1053,3084,3044],{"class":1105},[1053,3086,3052],{"class":1063},[1053,3088,1133],{"class":1105},[1053,3090,1109],{"class":1063},[1053,3092,1209],{"class":1105},[1053,3094,1144],{"class":1063},[1053,3096,3097,3100,3102,3104,3107,3109,3111,3113,3115,3117,3119,3121,3123,3125,3127],{"class":1055,"line":1589},[1053,3098,3099],{"class":1063},"        V ",[1053,3101,1093],{"class":1059},[1053,3103,1694],{"class":1105},[1053,3105,3106],{"class":1063},".W_v(value).view(batch_size, ",[1053,3108,2557],{"class":1059},[1053,3110,1133],{"class":1105},[1053,3112,1109],{"class":1063},[1053,3114,3044],{"class":1105},[1053,3116,3047],{"class":1063},[1053,3118,3044],{"class":1105},[1053,3120,3052],{"class":1063},[1053,3122,1133],{"class":1105},[1053,3124,1109],{"class":1063},[1053,3126,1209],{"class":1105},[1053,3128,1144],{"class":1063},[1053,3130,3131],{"class":1055,"line":1595},[1053,3132,1077],{"emptyLinePlaceholder":1076},[1053,3134,3135],{"class":1055,"line":1607},[1053,3136,3137],{"class":1083},"        # 计算注意力\n",[1053,3139,3140,3143,3145],{"class":1055,"line":1613},[1053,3141,3142],{"class":1063},"        output, _ ",[1053,3144,1093],{"class":1059},[1053,3146,3147],{"class":1063}," scaled_dot_product_attention(Q, K, V, mask)\n",[1053,3149,3150],{"class":1055,"line":1639},[1053,3151,1077],{"emptyLinePlaceholder":1076},[1053,3153,3154],{"class":1055,"line":1644},[1053,3155,3156],{"class":1083},"        # 拼接多头结果\n",[1053,3158,3159,3162,3164,3167,3169,3171,3173,3176,3178,3180,3182,3184,3186,3189,3191],{"class":1055,"line":1655},[1053,3160,3161],{"class":1063},"        output ",[1053,3163,1093],{"class":1059},[1053,3165,3166],{"class":1063}," output.transpose(",[1053,3168,1133],{"class":1105},[1053,3170,1109],{"class":1063},[1053,3172,1209],{"class":1105},[1053,3174,3175],{"class":1063},").contiguous().view(batch_size, ",[1053,3177,2557],{"class":1059},[1053,3179,1133],{"class":1105},[1053,3181,1109],{"class":1063},[1053,3183,3044],{"class":1105},[1053,3185,2910],{"class":1063},[1053,3187,3188],{"class":1059},"*",[1053,3190,1694],{"class":1105},[1053,3192,3193],{"class":1063},".d_k)\n",[1053,3195,3196,3198,3200],{"class":1055,"line":1665},[1053,3197,1715],{"class":1059},[1053,3199,1694],{"class":1105},[1053,3201,3202],{"class":1063},".W_o(output)\n",[1053,3204,3205],{"class":1055,"line":1670},[1053,3206,1077],{"emptyLinePlaceholder":1076},[1053,3208,3209,3212,3214,3217,3220,3222,3224,3226,3229,3231,3233],{"class":1055,"line":1675},[1053,3210,3211],{"class":1063},"mha ",[1053,3213,1093],{"class":1059},[1053,3215,3216],{"class":1063}," MultiHeadAttention(",[1053,3218,3219],{"class":1099},"d_model",[1053,3221,1093],{"class":1059},[1053,3223,2884],{"class":1105},[1053,3225,1109],{"class":1063},[1053,3227,3228],{"class":1099},"num_heads",[1053,3230,1093],{"class":1059},[1053,3232,1291],{"class":1105},[1053,3234,1144],{"class":1063},[1053,3236,3237,3239,3241,3243,3245,3247,3250,3252,3254,3256],{"class":1055,"line":1686},[1053,3238,1921],{"class":1063},[1053,3240,1093],{"class":1059},[1053,3242,1751],{"class":1063},[1053,3244,1209],{"class":1105},[1053,3246,1109],{"class":1063},[1053,3248,3249],{"class":1105},"20",[1053,3251,1109],{"class":1063},[1053,3253,2884],{"class":1105},[1053,3255,1809],{"class":1063},[1053,3257,3258],{"class":1083},"# batch=2, 序列长度=20, 维度=512\n",[1053,3260,3261,3264,3266,3269],{"class":1055,"line":1700},[1053,3262,3263],{"class":1063},"out ",[1053,3265,1093],{"class":1059},[1053,3267,3268],{"class":1063}," mha(x, x, x)           ",[1053,3270,3271],{"class":1083},"# 自注意力：Q=K=V\n",[1053,3273,3274,3276,3278,3280,3283,3285,3288,3290,3292,3294],{"class":1055,"line":1712},[1053,3275,1785],{"class":1105},[1053,3277,1407],{"class":1063},[1053,3279,1790],{"class":1059},[1053,3281,3282],{"class":1793},"\"多头注意力输出: ",[1053,3284,1797],{"class":1105},[1053,3286,3287],{"class":1063},"out.shape",[1053,3289,1803],{"class":1105},[1053,3291,1806],{"class":1793},[1053,3293,1809],{"class":1063},[1053,3295,3296],{"class":1083},"# (2, 20, 512)\n",[1351,3298,3299],{},"\n当 Query、Key、Value 来自同一个输入时，称为**自注意力（Self-Attention）**。自注意力让序列中的每个位置都能直接关注其他所有位置，克服了 RNN 需要逐步传递信息的限制。这是 Transformer 能够并行处理序列的关键。\n",[927,3301,3302],{"id":3302},"注意力的类型",[975,3304,3305,3318],{},[978,3306,3307],{},[981,3308,3309,3312,3315],{},[984,3310,3311],{},"类型",[984,3313,3314],{},"Q \u002F K \u002F V 来源",[984,3316,3317],{},"应用场景",[994,3319,3320,3331,3342],{},[981,3321,3322,3325,3328],{},[999,3323,3324],{},"自注意力",[999,3326,3327],{},"同一序列",[999,3329,3330],{},"Transformer 编码器",[981,3332,3333,3336,3339],{},[999,3334,3335],{},"交叉注意力",[999,3337,3338],{},"Q 来自解码器，K\u002FV 来自编码器",[999,3340,3341],{},"机器翻译、图像描述",[981,3343,3344,3347,3350],{},[999,3345,3346],{},"因果注意力",[999,3348,3349],{},"同一序列 + 掩码",[999,3351,3352],{},"GPT 等自回归模型",[892,3354,3355],{"id":3355},"常见应用场景",[927,3357,3359],{"id":3358},"图像分类cnn","图像分类（CNN）",[900,3361,3363],{"className":1047,"code":3362,"language":1049,"meta":11,"style":11},"import torchvision.models as models\n\n# 使用预训练的 ResNet-18 进行迁移学习\nmodel = models.resnet18(pretrained=True)\n\n# 冻结特征提取层\nfor param in model.parameters():\n    param.requires_grad = False\n\n# 替换最后的全连接层（适配自定义类别数）\nmodel.fc = nn.Linear(model.fc.in_features, num_classes=5)\n\n# 只训练新加的全连接层\noptimizer = torch.optim.Adam(model.fc.parameters(), lr=0.001)\n",[908,3364,3365,3377,3381,3386,3404,3408,3413,3427,3437,3441,3446,3465,3469,3474],{"__ignoreMap":11},[1053,3366,3367,3369,3372,3374],{"class":1055,"line":1056},[1053,3368,1060],{"class":1059},[1053,3370,3371],{"class":1063}," torchvision.models ",[1053,3373,1067],{"class":1059},[1053,3375,3376],{"class":1063}," models\n",[1053,3378,3379],{"class":1055,"line":1073},[1053,3380,1077],{"emptyLinePlaceholder":1076},[1053,3382,3383],{"class":1055,"line":1080},[1053,3384,3385],{"class":1083},"# 使用预训练的 ResNet-18 进行迁移学习\n",[1053,3387,3388,3390,3392,3395,3398,3400,3402],{"class":1055,"line":1087},[1053,3389,1729],{"class":1063},[1053,3391,1093],{"class":1059},[1053,3393,3394],{"class":1063}," models.resnet18(",[1053,3396,3397],{"class":1099},"pretrained",[1053,3399,1093],{"class":1059},[1053,3401,1905],{"class":1105},[1053,3403,1144],{"class":1063},[1053,3405,3406],{"class":1055,"line":1147},[1053,3407,1077],{"emptyLinePlaceholder":1076},[1053,3409,3410],{"class":1055,"line":1152},[1053,3411,3412],{"class":1083},"# 冻结特征提取层\n",[1053,3414,3415,3418,3421,3424],{"class":1055,"line":1158},[1053,3416,3417],{"class":1059},"for",[1053,3419,3420],{"class":1063}," param ",[1053,3422,3423],{"class":1059},"in",[1053,3425,3426],{"class":1063}," model.parameters():\n",[1053,3428,3429,3432,3434],{"class":1055,"line":1454},[1053,3430,3431],{"class":1063},"    param.requires_grad ",[1053,3433,1093],{"class":1059},[1053,3435,3436],{"class":1105}," False\n",[1053,3438,3439],{"class":1055,"line":1460},[1053,3440,1077],{"emptyLinePlaceholder":1076},[1053,3442,3443],{"class":1055,"line":1474},[1053,3444,3445],{"class":1083},"# 替换最后的全连接层（适配自定义类别数）\n",[1053,3447,3448,3451,3453,3456,3459,3461,3463],{"class":1055,"line":1509},[1053,3449,3450],{"class":1063},"model.fc ",[1053,3452,1093],{"class":1059},[1053,3454,3455],{"class":1063}," nn.Linear(model.fc.in_features, ",[1053,3457,3458],{"class":1099},"num_classes",[1053,3460,1093],{"class":1059},[1053,3462,1277],{"class":1105},[1053,3464,1144],{"class":1063},[1053,3466,3467],{"class":1055,"line":1515},[1053,3468,1077],{"emptyLinePlaceholder":1076},[1053,3470,3471],{"class":1055,"line":1529},[1053,3472,3473],{"class":1083},"# 只训练新加的全连接层\n",[1053,3475,3476,3479,3481,3484,3487,3489,3492],{"class":1055,"line":1534},[1053,3477,3478],{"class":1063},"optimizer ",[1053,3480,1093],{"class":1059},[1053,3482,3483],{"class":1063}," torch.optim.Adam(model.fc.parameters(), ",[1053,3485,3486],{"class":1099},"lr",[1053,3488,1093],{"class":1059},[1053,3490,3491],{"class":1105},"0.001",[1053,3493,1144],{"class":1063},[2451,3495,3496],{},"\n迁移学习是实际项目中最常用的方法。使用在 ImageNet 上预训练好的模型作为特征提取器，只需少量数据就能训练出效果不错的分类器。\n",[927,3498,3500],{"id":3499},"文本分类rnn-attention","文本分类（RNN \u002F Attention）",[900,3502,3504],{"className":1047,"code":3503,"language":1049,"meta":11,"style":11},"class TextClassifier(nn.Module):\n    def __init__(self, vocab_size, embed_dim=128, hidden_dim=256, num_classes=4):\n        super().__init__()\n        self.embedding = nn.Embedding(vocab_size, embed_dim)\n        self.lstm = nn.LSTM(embed_dim, hidden_dim, batch_first=True, bidirectional=True)\n        self.classifier = nn.Linear(hidden_dim * 2, num_classes)\n\n    def forward(self, x):\n        embedded = self.embedding(x)                # (batch, seq_len, embed_dim)\n        output, (hidden, _) = self.lstm(embedded)   # output: (batch, seq_len, hidden*2)\n\n        # 取最后时间步的输出进行分类\n        last_output = output[:, -1, :]\n        return self.classifier(last_output)\n\nmodel = TextClassifier(vocab_size=10000)\ntokens = torch.randint(0, 10000, (16, 100))  # 16 个句子，每句 100 个 token\noutput = model(tokens)\nprint(f\"分类输出: {output.shape}\")  # (16, 4)\n",[908,3505,3506,3523,3553,3563,3575,3603,3621,3625,3633,3648,3663,3667,3672,3689,3698,3702,3721,3754,3763],{"__ignoreMap":11},[1053,3507,3508,3510,3513,3515,3517,3519,3521],{"class":1055,"line":1056},[1053,3509,1400],{"class":1059},[1053,3511,3512],{"class":1403}," TextClassifier",[1053,3514,1407],{"class":1063},[1053,3516,1410],{"class":1403},[1053,3518,1413],{"class":1063},[1053,3520,1416],{"class":1403},[1053,3522,1419],{"class":1063},[1053,3524,3525,3527,3529,3532,3534,3536,3539,3541,3543,3546,3548,3551],{"class":1055,"line":1073},[1053,3526,1424],{"class":1059},[1053,3528,1427],{"class":1105},[1053,3530,3531],{"class":1063},"(self, vocab_size, embed_dim",[1053,3533,1093],{"class":1059},[1053,3535,1633],{"class":1105},[1053,3537,3538],{"class":1063},", hidden_dim",[1053,3540,1093],{"class":1059},[1053,3542,1886],{"class":1105},[1053,3544,3545],{"class":1063},", num_classes",[1053,3547,1093],{"class":1059},[1053,3549,3550],{"class":1105},"4",[1053,3552,1419],{"class":1063},[1053,3554,3555,3557,3559,3561],{"class":1055,"line":1080},[1053,3556,1442],{"class":1105},[1053,3558,1445],{"class":1063},[1053,3560,1448],{"class":1105},[1053,3562,1451],{"class":1063},[1053,3564,3565,3567,3570,3572],{"class":1055,"line":1087},[1053,3566,1463],{"class":1105},[1053,3568,3569],{"class":1063},".embedding ",[1053,3571,1093],{"class":1059},[1053,3573,3574],{"class":1063}," nn.Embedding(vocab_size, embed_dim)\n",[1053,3576,3577,3579,3582,3584,3587,3589,3591,3593,3595,3597,3599,3601],{"class":1055,"line":1147},[1053,3578,1463],{"class":1105},[1053,3580,3581],{"class":1063},".lstm ",[1053,3583,1093],{"class":1059},[1053,3585,3586],{"class":1063}," nn.LSTM(embed_dim, hidden_dim, ",[1053,3588,1900],{"class":1099},[1053,3590,1093],{"class":1059},[1053,3592,1905],{"class":1105},[1053,3594,1109],{"class":1063},[1053,3596,2144],{"class":1099},[1053,3598,1093],{"class":1059},[1053,3600,1905],{"class":1105},[1053,3602,1144],{"class":1063},[1053,3604,3605,3607,3609,3611,3614,3616,3619],{"class":1055,"line":1152},[1053,3606,1463],{"class":1105},[1053,3608,1600],{"class":1063},[1053,3610,1093],{"class":1059},[1053,3612,3613],{"class":1063}," nn.Linear(hidden_dim ",[1053,3615,3188],{"class":1059},[1053,3617,3618],{"class":1105}," 2",[1053,3620,1662],{"class":1063},[1053,3622,3623],{"class":1055,"line":1158},[1053,3624,1077],{"emptyLinePlaceholder":1076},[1053,3626,3627,3629,3631],{"class":1055,"line":1454},[1053,3628,1424],{"class":1059},[1053,3630,1680],{"class":1403},[1053,3632,1683],{"class":1063},[1053,3634,3635,3638,3640,3642,3645],{"class":1055,"line":1460},[1053,3636,3637],{"class":1063},"        embedded ",[1053,3639,1093],{"class":1059},[1053,3641,1694],{"class":1105},[1053,3643,3644],{"class":1063},".embedding(x)                ",[1053,3646,3647],{"class":1083},"# (batch, seq_len, embed_dim)\n",[1053,3649,3650,3653,3655,3657,3660],{"class":1055,"line":1474},[1053,3651,3652],{"class":1063},"        output, (hidden, _) ",[1053,3654,1093],{"class":1059},[1053,3656,1694],{"class":1105},[1053,3658,3659],{"class":1063},".lstm(embedded)   ",[1053,3661,3662],{"class":1083},"# output: (batch, seq_len, hidden*2)\n",[1053,3664,3665],{"class":1055,"line":1509},[1053,3666,1077],{"emptyLinePlaceholder":1076},[1053,3668,3669],{"class":1055,"line":1515},[1053,3670,3671],{"class":1083},"        # 取最后时间步的输出进行分类\n",[1053,3673,3674,3677,3679,3682,3684,3686],{"class":1055,"line":1529},[1053,3675,3676],{"class":1063},"        last_output ",[1053,3678,1093],{"class":1059},[1053,3680,3681],{"class":1063}," output[:, ",[1053,3683,2557],{"class":1059},[1053,3685,1133],{"class":1105},[1053,3687,3688],{"class":1063},", :]\n",[1053,3690,3691,3693,3695],{"class":1055,"line":1534},[1053,3692,1715],{"class":1059},[1053,3694,1694],{"class":1105},[1053,3696,3697],{"class":1063},".classifier(last_output)\n",[1053,3699,3700],{"class":1055,"line":1566},[1053,3701,1077],{"emptyLinePlaceholder":1076},[1053,3703,3704,3706,3708,3711,3714,3716,3719],{"class":1055,"line":1571},[1053,3705,1729],{"class":1063},[1053,3707,1093],{"class":1059},[1053,3709,3710],{"class":1063}," TextClassifier(",[1053,3712,3713],{"class":1099},"vocab_size",[1053,3715,1093],{"class":1059},[1053,3717,3718],{"class":1105},"10000",[1053,3720,1144],{"class":1063},[1053,3722,3723,3726,3728,3731,3733,3735,3737,3740,3743,3745,3748,3751],{"class":1055,"line":1583},[1053,3724,3725],{"class":1063},"tokens ",[1053,3727,1093],{"class":1059},[1053,3729,3730],{"class":1063}," torch.randint(",[1053,3732,3012],{"class":1105},[1053,3734,1109],{"class":1063},[1053,3736,3718],{"class":1105},[1053,3738,3739],{"class":1063},", (",[1053,3741,3742],{"class":1105},"16",[1053,3744,1109],{"class":1063},[1053,3746,3747],{"class":1105},"100",[1053,3749,3750],{"class":1063},"))  ",[1053,3752,3753],{"class":1083},"# 16 个句子，每句 100 个 token\n",[1053,3755,3756,3758,3760],{"class":1055,"line":1589},[1053,3757,1774],{"class":1063},[1053,3759,1093],{"class":1059},[1053,3761,3762],{"class":1063}," model(tokens)\n",[1053,3764,3765,3767,3769,3771,3774,3776,3778,3780,3782,3784],{"class":1055,"line":1595},[1053,3766,1785],{"class":1105},[1053,3768,1407],{"class":1063},[1053,3770,1790],{"class":1059},[1053,3772,3773],{"class":1793},"\"分类输出: ",[1053,3775,1797],{"class":1105},[1053,3777,1800],{"class":1063},[1053,3779,1803],{"class":1105},[1053,3781,1806],{"class":1793},[1053,3783,1809],{"class":1063},[1053,3785,3786],{"class":1083},"# (16, 4)\n",[927,3788,3790],{"id":3789},"序列到序列seq2seq","序列到序列（Seq2Seq）",[896,3792,3793],{},"Seq2Seq 模型将一个序列映射到另一个序列，典型应用包括机器翻译、文本摘要、对话系统等。",[900,3795,3798],{"className":3796,"code":3797,"language":905,"meta":906},[903],"flowchart LR\n    subgraph Encoder[\"编码器 #40;Encoder#41;\"]\n        I1[\"I\"] --> E1[\"LSTM\"]\n        I2[\"love\"] --> E2[\"LSTM\"]\n        I3[\"you\"] --> E3[\"LSTM\"]\n        E1 --> E2 --> E3\n    end\n    subgraph Decoder[\"解码器 #40;Decoder#41;\"]\n        D1[\"LSTM\"] --> O1[\"我\"]\n        D2[\"LSTM\"] --> O2[\"爱\"]\n        D3[\"LSTM\"] --> O3[\"你\"]\n        D1 --> D2 --> D3\n    end\n    E3 --> D1\n",[908,3799,3797],{"__ignoreMap":11},[896,3801,3802],{},"加入注意力机制后，解码器在生成每个词时可以动态关注编码器中最相关的部分，显著提升了翻译质量。",[892,3804,3805],{"id":3805},"架构选型指南",[975,3807,3808,3820],{},[978,3809,3810],{},[981,3811,3812,3815,3818],{},[984,3813,3814],{},"任务类型",[984,3816,3817],{},"推荐架构",[984,3819,989],{},[994,3821,3822,3833,3844,3855,3866,3877],{},[981,3823,3824,3827,3830],{},[999,3825,3826],{},"图像分类",[999,3828,3829],{},"CNN (ResNet, EfficientNet)",[999,3831,3832],{},"成熟方案，预训练模型丰富",[981,3834,3835,3838,3841],{},[999,3836,3837],{},"目标检测",[999,3839,3840],{},"CNN (YOLO, Faster R-CNN)",[999,3842,3843],{},"实时检测优先选 YOLO",[981,3845,3846,3849,3852],{},[999,3847,3848],{},"文本分类",[999,3850,3851],{},"Transformer (BERT)",[999,3853,3854],{},"当前最佳方案",[981,3856,3857,3860,3863],{},[999,3858,3859],{},"机器翻译",[999,3861,3862],{},"Transformer",[999,3864,3865],{},"已全面取代 RNN Seq2Seq",[981,3867,3868,3871,3874],{},[999,3869,3870],{},"语音识别",[999,3872,3873],{},"Transformer (Whisper)",[999,3875,3876],{},"CNN+RNN 组合仍有使用",[981,3878,3879,3882,3885],{},[999,3880,3881],{},"时间序列",[999,3883,3884],{},"LSTM \u002F Transformer",[999,3886,3887],{},"短序列用 LSTM，长序列用 Transformer",[2003,3889,3890],{},"\n虽然 Transformer 在 NLP 领域已全面取代 RNN，但在资源受限的场景（嵌入式设备、实时系统）或短序列任务中，LSTM\u002FGRU 仍然是高效的选择。选择架构时应综合考虑任务需求、数据量和计算资源。\n",[892,3892,3893],{"id":3893},"小结",[896,3895,3896],{},"三种核心架构的定位：",[938,3898,3899,3905,3911],{},[941,3900,3901,3904],{},[918,3902,3903],{},"CNN","：通过局部卷积和池化提取空间特征，是图像处理的基石",[941,3906,3907,3910],{},[918,3908,3909],{},"RNN\u002FLSTM\u002FGRU","：通过隐藏状态传递时序信息，适合序列建模",[941,3912,3913,3916],{},[918,3914,3915],{},"注意力机制","：打破位置限制，动态建模序列中任意位置间的关系",[896,3918,3919],{},"Transformer 架构将自注意力机制作为核心构建块，结合了并行计算的效率和全局关系建模的能力，已成为当前最主流的深度学习架构。后续可以进一步学习 Transformer 的完整架构以及基于它的大语言模型（LLM）。",[3921,3922,3923],"style",{},"html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sP4rz, html code.shiki .sP4rz{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":11,"searchDepth":1073,"depth":1073,"links":3925},[3926,3927,3934,3940,3946,3951,3952],{"id":894,"depth":1073,"text":894},{"id":912,"depth":1073,"text":913,"children":3928},[3929,3930,3931,3932,3933],{"id":929,"depth":1080,"text":930},{"id":960,"depth":1080,"text":961},{"id":1164,"depth":1080,"text":1165},{"id":1245,"depth":1080,"text":1246},{"id":1356,"depth":1080,"text":1357},{"id":1815,"depth":1073,"text":1816,"children":3935},[3936,3937,3938,3939],{"id":1822,"depth":1080,"text":1823},{"id":2008,"depth":1080,"text":2009},{"id":2242,"depth":1080,"text":2243},{"id":2376,"depth":1080,"text":2377},{"id":2456,"depth":1073,"text":2457,"children":3941},[3942,3943,3944,3945],{"id":2463,"depth":1080,"text":2463},{"id":2469,"depth":1080,"text":2469},{"id":2844,"depth":1080,"text":2845},{"id":3302,"depth":1080,"text":3302},{"id":3355,"depth":1073,"text":3355,"children":3947},[3948,3949,3950],{"id":3358,"depth":1080,"text":3359},{"id":3499,"depth":1080,"text":3500},{"id":3789,"depth":1080,"text":3790},{"id":3805,"depth":1073,"text":3805},{"id":3893,"depth":1073,"text":3893},"md",{},{"title":50,"description":51},"ai\u002Ffundamentals\u002Fneural-networks","rZnPbaNjHIH9U8AnsxpKyDZNgJ_qFFkD_ncq6QfKtWg",1775474634440]