摘要:好久不看理论,最近把自己学过以及用到过的东西都列了出来,主要是这个大纲体系,详细的内容部分是使用LLM来辅助编写的。
一、大模型
1.1 常用大模型
1.1.1 Qwen
Qwen大模型是由阿里巴巴开发的系列大语言模型,最早在2023年8月开源,参数规模从18亿到720亿不等。Qwen系列模型包括基础模型和对话模型,基础模型涵盖多语言数据,对话模型则具备多种能力,如聊天、创作、摘要、信息抽取、翻译、代码生成和数学推理等。
Qwen系列模型的参数规模包括18亿(1.8B)、70亿(7B)、140亿(14B)和720亿(72B),以及对话模型Qwen-Chat,参数规模分别为1.8B、7B、14B和72B。这些模型经过稳定训练,使用大规模、高质量且多样化的数据,涵盖多语言(以中文和英文为主),总量达3万亿token
1.1.2 Llama
LLaMA(Large Language Model Meta AI)是由Meta(前身为Facebook)开发的一种大规模语言模型,旨在提高自然语言处理(NLP)任务的性能。LLaMA基于变换器(Transformer)架构,并经过大规模数据训练,以便在多种语言任务中表现出色。
1.1.3 Gemma
Gemma是Google推出的一系列轻量级、最先进的开放模型,基于创建Gemini模型的相同研究和技术构建。提供了 2B 和 7B 两种不同规模的版本,每种都包含了预训练基础版本和经过指令优化的版本。所有版本均可在各类消费级硬件上运行,无需数据量化处理,拥有高达 8K tokens 的处理能力。
1.1.4 Baichuan
百川大模型是由百川智能研发的一系列大语言模型,具备超千亿参数,采用了“动态数据选择”、“重要度保持”以及“异步CheckPoint存储”等创新技术手段,提升了模型的各项能力。
1.1.5 Yi
Yi大模型是由零一万物(01.ai)发布的开源大模型,主要包括Yi-34B和Yi-6B两个版本。Yi大模型在多个基准测试中表现出色,特别是在Hugging Face的英文测试榜单和C-Eval中文能力排行榜上取得了优异成绩,甚至在MMLU、BBH等综合能力测试中胜出。
1.2 推理框架
这一章节使用方法可以查看往期帖子,大模型运行ollama、vllm、huggingface、modelscope
1.2.1 ollama
Ollama是一个开源框架,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计。其主要特点和功能包括:
简化部署: Ollama旨在简化在Docker容器中部署大型语言模型的过程,使得非专业用户也能方便地管理和运行这些复杂的模型。
轻量级与可扩展: 作为轻量级框架,Ollama保持了较小的资源占用,同时具备良好的可扩展性,允许用户根据需要调整配置以适应不同规模的项目和硬件条件。
API支持: 提供了一个简洁的API,使得开发者能够轻松创建、运行和管理大型语言模型实例,降低了与模型交互的技术门槛。
预构建模型库: 包含一系列预先训练好的大型语言模型,用户可以直接选用这些模型应用于自己的应用程序,无需从头训练或自行寻找模型源。
模型导入与定制: 支持从特定平台(如GGUF)导入已有的大型语言模型,兼容PyTorch或Safetensors深度学习框架,允许用户为模型添加或修改提示,以引导模型生成特定类型或风格的文本输出。
跨平台支持: 提供针对macOS、Windows(预览版)、Linux以及Docker的安装指南,确保用户能在多种操作系统环境下顺利部署和使用Ollama。
1.2.2 vllm
vLLM(Virtual Large Language Model)是一个由伯克利大学LMSYS组织开源的大语言模型高速推理框架,旨在极大地提升实时场景下的语言模型服务的吞吐与内存使用效率。vLLM利用了全新的注意力算法「PagedAttention」,有效地管理注意力键和值,从而显著提高了推理性能。
在吞吐量方面,vLLM的性能比HuggingFace Transformers高出24倍,比文本生成推理(TGI)高出3.5倍。此外,vLLM还支持离线推理和在线推理两种方式。离线推理适用于将图像和文本输入模型获取输出结果,而在线推理则通过API接口集成到应用程序中,实现实时处理。
1.2.3 huggingface
Hugging Face是一家成立于2016年的开源模型库公司,总部位于纽约。其创始人是Clément Delangue、Julien Chaumond和Thomas Wolf,三位热衷于自然语言处理(NLP)和机器学习的研究者和工程师。公司最初专注于开发聊天机器人和对话系统,后来逐渐将重点转移到NLP领域的开源库和工具上。
1.2.4 modelscope
ModelScope是由阿里巴巴达摩院发布的机器学习模型平台,旨在简化机器学习模型的使用流程,提供一站式服务,包括模型探索、推理、训练、部署和应用。
1.3 常用RAG-Agent
1.3.1 Langchain-chatchat
LangChain-ChatChat是一个基于ChatGLM等大语言模型与LangChain等应用框架实现的开源项目,旨在建立一个对中文场景友好、可离线运行的知识库问答解决方案。该项目通过本地知识库的问答应用,利用LangChain的思想,实现了对开源模型的支持和私有部署。
LangChain-ChatChat适用于各种需要高级自然语言理解和生成的场景,如企业内部的知识管理系统、客户服务聊天机器人以及教育领域的辅助教学工具等。无论是处理大量的文档资料还是回应用户的即时咨询,LangChain-ChatChat都能提供高质量的交互式体验。
1.3.2 Bisheng
BISHENG是一款开源的LLM应用开发平台,主要用于企业场景。它由华为技术有限公司开发,并于2023年8月底正式基于Apache 2.0协议开源。BISHENG的Github地址为https://github.com/dataelement/bisheng,Demo环境地址为https://bisheng.dataelem.com/。
主要特点
便捷: 即使是业务人员,也可以通过预置的毕昇助手与技能模板,通过简单直观的表单填写方式快速搭建以大模型为核心的智能应用。
灵活: 对大模型技术有了解的人员可以利用数百种开发组件,基于可视化且自由的流程编排能力,开发出丰富的大模型应用,如智能问答、报告生成、自动化、数据分析等。
可靠与企业级: BISHENG具备高并发下的高可用性、应用运营及效果持续迭代优化等企业级特性,适用于真实业务场景。此外,它还提供了完备的非结构化数据治理能力。
1.3.3 Dify
Dify是一个开源的大语言模型(LLM)应用开发平台,旨在简化和加速生成式AI应用的创建和部署。它融合了后端即服务(Backend as Service)和LLMOps的理念,涵盖了构建生成式AI原生应用所需的核心技术栈,包括一个内置的RAG引擎。
Dify支持多种大型语言模型的API接入和调用,包括Claude3、OpenAI等,并与多个模型供应商合作,确保开发者能根据需求选择最适合的模型2。此外,Dify还提供了以下功能:
知识库管理: 支持导入自己的知识库来训练模型,支持对接Notion作为知识库数据来源。
多模态输入输出: 支持图片、文字、语音的输入输出,支持Stable Diffusion WebUI进行图片生成。
多平台集成: 支持接入微信、QQ、钉钉、飞书等平台。
其他工具: 支持网页爬虫、搜索DuckDuckGo、Google SERP、Bing SERP,提供生物医学文献引用、生成二维码、发送SMS等功能。
使用场景
Dify可以用于创建各种AI应用,如评分系统、游戏线路导流、图片视频识别等。它还可以用于创建工作流、机器人智能客服、ASgent等,并暴露接口,上游将参数传递给应用,得到结果并返回给上游端。
1.3.4 FastGPT
FastGPT是一个基于大语言模型(LLM)的智能化平台,擅长理解和处理自然语言。它通过深度学习技术,能够从各种数据源中自动提取和整合信息,生成语义丰富的知识库,并实现智能化的响应和检索。FastGPT的核心功能包括工作流编排和知识库管理,通过这些功能,用户可以快速构建高效的知识库应用。
1.4 大模型微调方法
这一章节详细内容可以查看往期帖子,LLM大模型微调
特性 | LoRA (低秩适应) | Adapter (适配器) |
---|---|---|
定义 | 通过添加低秩矩阵来修改预训练模型的权重,以实现特定任务的微调。 | 在预训练模型的基础上插入小型的、可训练的网络模块(即Adapters),这些模块用于学习特定任务的知识。 |
参数量 | 较少,因为只引入了低秩矩阵。 | 也较少,但通常比LoRA多,因为Adapters可能包含多个层。 |
计算成本 | 相对较低,由于更新的参数较少。 | 中等,取决于Adapter的设计复杂度。 |
微调速度 | 快,因为需要优化的参数较少。 | 较快,但由于可能有更多层,所以比LoRA慢一些。 |
模型性能 | 可能会有所下降,尤其是在资源非常有限的情况下。 | 通常能保持较好的性能,因为Adapter有能力捕捉更复杂的模式。 |
泛化能力 | 由于参数量少,可能会有较好的泛化能力,尤其是在小数据集上。 | 泛化能力较好,因为它能够学习到更丰富的特征表示。 |
迁移学习 | 易于迁移,因为主要调整的是少量的参数。 | 也易于迁移,但可能需要根据新任务调整Adapter的设计。 |
模型大小 | 微调后的模型大小增加不大。 | 模型大小增加相对较大,取决于Adapter的复杂度。 |
适应场景 | 非常适合资源受限的环境或快速原型设计。 | 适用于需要较高准确性的场景,尤其是当有足够的计算资源时。 |
1.4.1 lora
LoRA 的核心思想是:在不改变原始模型权重的情况下,通过引入低秩矩阵的增量来进行微调。也就是说,LoRA 不直接更新原模型的参数,而是为其特定的层添加额外的可训练参数,从而实现对模型的适应调整。一方面知识对部分层进行微调,另一方面还对需要更新的矩阵层ΔW进行了分解,进一步减少了参数量和计算量。
1.4.2 adapter
插入位置: LoRA 是以残差连接的形式 “并联” 在 Transformer 的 W 矩阵上,而 Adapter 是插入在 Feed-forward Layer 后面。
推理延迟: LoRA 在训练完后其参数可以与原有预训练模型直接合并,变回单分支结构,不会引入额外的延迟;而 Adapter 由于引入了额外的串联网络层,因此会带来额外的延迟。
参数存储: 使用 LoRA 进行微调,在训练完毕后只需要保存 LoRA 本身的参数;而使用 Adapter 则要保存整个原有模型的参数。
1.5 微调框架LlamaFactory
这一章节详细内容可以查看往期帖子,LLM大模型微调入门Lora(LlamaFactory)
LLaMA-Factory 是一个开源框架,旨在简化大型语言模型的定制化微调流程。该框架整合了多样化的训练策略与监控工具,支持通过命令行界面(CLI)和网页用户界面(WebUI)等多种方式进行交互,显著降低了进行模型微调所需的技术门槛。通过 LLaMA-Factory,用户能够更加高效、便捷地调整模型以适应特定的应用场景或数据集,进而提升模型性能和应用效果。
1.6 大模型训练方法-RLHF
有个不错的帖子,链接
RLHF(基于人类反馈的强化学习)是一种训练大模型的方法,旨在通过引入人类反馈来优化模型的行为和输出,使其更好地满足人类的需求。这种方法结合了强化学习算法和人类偏好,通过奖励信号指导模型的训练过程,从而增强模型对人类意图的理解和满足程度。
(1)RLHF的基本概念和框架
强化学习算法:常用的算法是PPO(近端策略优化),这是一种“on-policy”算法,直接学习和更新当前策略。
行动:行动指的是语言模型根据给定的提示生成的输出文本,这些文本是模型在尝试完成特定任务或响应特定指令时产生的。
环境:环境是代理(即语言模型)与之交互的外部世界,提供代理可以观察的状态、执行的动作以及根据这些动作给予的奖励。
(2)RLHF的训练过程
使用监督数据微调语言模型:这一阶段与传统的fine-tuning类似,使用大量的监督数据进行预训练。
训练奖励模型:奖励模型输入一个文本序列,输出符合人类偏好的奖励数值。构建奖励模型的训练数据一般是同一个数据用不同的语言模型生成结果,然后人工打分。
训练强化学习模型:在强化学习训练中,需要搞清楚状态空间、动作空间、策略函数和价值函数。动作空间是所有的token,状态空间是输入序列的分布,价值函数由奖励模型和策略约束结合。
二、NLP
2.1 常见网络
2.1.1 CNN
卷积神经网络(Convolutional Neural Network, CNN)是一种在计算机视觉领域取得了巨大成功的深度学习模型。CNN的设计灵感源自人脑的视觉处理方式,旨在模拟人类视觉系统对图像的处理机制。与传统的全连接神经网络不同,CNN通过在输入数据上应用卷积操作来提取局部特征,并通过训练过程自动学习这些卷积操作的参数。
CNN的核心组件及其功能
(1)卷积层(Convolutional Layer)
- 卷积层是CNN的核心组件之一,包含多个可学习的滤波器(也称为卷积核),这些滤波器在输入数据上滑动,进行卷积操作并生成特征图。每个滤波器专注于检测输入数据的不同特征,如边缘、纹理等。通过堆叠多个卷积层,网络能够学习到更加复杂和抽象的特征。
(2)池化层(Pooling Layer)
- 池化层用于减小特征图的空间维度,从而减少模型的参数量和计算复杂度,并且可以增强模型的鲁棒性。最常用的池化操作是最大池化(Max Pooling),它在每个区域内保留最大的特征值。池化操作通过保持主要特征并减少冗余信息来提取出更加重要的特征。
(3)全连接层(Fully Connected Layer)
- 全连接层将卷积层和池化层提取到的特征连接起来,并输出最终的分类或回归结果。它采用传统神经网络中常见的全连接结构,每个神经元都与上一层的所有神经元相连。全连接层的作用是对特征进行组合和整合,以便进行最终的预测。
CNN的特点及其优势
- 局部感受野:CNN通过局部感受野的方式减少参数数量,使得网络易于优化。
- 权值共享:每个滤波器在输入数据上滑动时共享相同的参数,进一步减少了模型的复杂度和过拟合的风险。
- 空间层次结构:CNN的各层中的神经元是3维排列的,包括宽度、高度和深度,这使得CNN能够有效地处理具有空间结构的输入数据,如图像。
CNN的应用领域
CNN在图像识别、目标检测、图像生成等领域取得了显著的进展。例如,AlexNet在2012年的ImageNet比赛中的成功,使得CNN在计算机视觉任务中得到了广泛应用。此外,CNN还可以用于人脸识别、场景理解等任务。
2.1.2 RNN
循环神经网络(Recurrent Neural Network,RNN)是一种在序列数据处理中取得巨大成功的深度学习模型。RNN通过引入时间序列上的隐藏状态,具有处理时序数据和捕捉上下文信息的能力。本文将详细介绍RNN的原理、结构以及在自然语言处理和语音识别等领域的重要应用。
2.1.2.1 RNN原理
2.1.2.1.1 基本思想
RNN的基本思想是引入“记忆”机制,使神经网络可以处理序列数据并保持对过去信息的记忆。每个时间步的隐藏状态会根据输入和前一个时间步的隐藏状态进行更新,从而实现信息的传递和保存。这使得RNN可以捕捉到上下文关系,并对时序数据进行建模。
2.1.2.1.2 循环结构
RNN的循环结构是其与其他神经网络模型最明显的区别。隐藏状态会在每个时间步上被更新,并在下一个时间步作为输入的一部分被传递。这种反馈机制允许网络保持对过去信息的记忆,并在不同时间步上共享权重,避免参数数量的爆炸性增长。
2.1.2.1.3 长期依赖问题
尽管RNN在处理序列数据时具有优势,但在处理长序列时却存在长期依赖问题。由于信息的传递和变换通过每个时间步的隐藏状态完成,当序列较长时,梯度会随着时间步的增加而指数级衰减或爆炸。为了解决这个问题,出现了一些改进的RNN结构,如LSTM和GRU。
2.1.2.2 RNN结构
2.1.2.2.1 输入和输出
RNN的输入可以是任意长度的序列数据,如文本、语音等。每个时间步的输入会与隐藏状态进行计算,并得到输出结果。输出可以是每个时间步的预测结果,也可以是最后一个时间步的隐藏状态。
2.1.2.2.2 隐藏状态更新
RNN的隐藏状态更新是RNN的核心操作。隐藏状态会根据当前时间步的输入和前一个时间步的隐藏状态进行计算,并被传递给下一个时间步。隐藏状态的更新可以使用简单的线性变换和激活函数,也可以使用更复杂的门控机制。
2.1.2.2.3 参数共享
RNN中的参数共享是其特点之一。在每个时间步上,RNN使用相同的权重和偏置进行计算。这种参数共享使得RNN可以处理任意长度的序列数据,并减少了模型的参数数量,提高了训练效率。
2.1.3 LSTM
长短期记忆(LSTM)神经网络是一种特殊的递归神经网络(RNN),专为处理和生成序列数据而设计。LSTM 通过引入“门”的概念来控制信息的流动,解决了传统RNN在处理长序列时的梯度消失和爆炸问题。
(1)LSTM的组成
- LSTM由三个门组成:输入门、遗忘门和输出门。每个门都由一个或多个神经元构成,它们通过加权连接的方式组合在一起。
- 输入门:决定新信息的进入。它包含一个sigmoid层和一个tanh层,sigmoid层控制哪些信息将被更新,tanh层则生成新的候选值供更新。
- 遗忘门:负责控制上一时刻状态中有哪些信息被保留至当前时刻。通过一个sigmoid函数确定哪些信息将被遗忘,哪些信息将被保留。
- 输出门:决定当前时刻的输出。它首先将隐藏状态通过一个tanh层进行压缩,然后通过一个sigmoid层确定输出的最终部分。
(2)LSTM的工作原理
- 在t时刻,输入数据首先经过输入门和遗忘门。通过sigmoid和tanh激活函数的处理,一部分旧的信息被遗忘,新的信息被添加进来。这一过程保证了网络能够学习和记忆长期依赖关系。
- LSTM的核心在于门控机制,通过sigmoid函数和tanh函数的组合,实现了对信息的筛选和更新。这种机制使得LSTM在处理序列数据时具有更强的鲁棒性,能够有效地避免梯度消失和爆炸问题。
- LSTM的输出由输出门决定,它首先将隐藏状态压缩,然后通过sigmoid函数决定最终的输出部分。这使得LSTM具有更好的灵活性,可以适用于不同的任务和应用领域。
- LSTM在训练过程中使用反向传播算法(Backpropagation)进行参数调整。由于LSTM具有非线性特性,通过反向传播算法可以有效地优化网络参数,提高模型的准确率。
- LSTM具有很好的泛化能力,能够在不同的数据集上表现良好。这归功于其门控机制对信息的筛选和更新,使得网络能够有效地学习和记忆长期依赖关系。
- LSTM还可以通过各种变体进行扩展,如双向LSTM、深度LSTM等。这些变体可以进一步提高网络的性能,使其在各种任务中表现出色。
2.1.4 Transformer
Transformer是一种在自然语言处理(NLP)领域具有革命性意义的架构。它诞生于对传统序列处理模型(如循环神经网络RNN及其变体LSTM、GRU)局限性的突破需求。传统的RNN类模型在处理长序列数据时存在梯度消失或梯度爆炸问题,并且难以进行并行计算。
Transformer首次出现在论文《Attention is All You Need》中,它完全基于注意力机制(Attention Mechanism)构建,摒弃了传统的循环和卷积结构。
其核心在于利用自注意力机制(Self Attention)来对输入序列中的各个元素之间的关系进行建模。自注意力机制能够让模型在处理一个词(或序列中的其他元素)时,综合考虑输入序列中其他词与它的关联程度。例如,在翻译句子“我喜欢苹果”时,模型通过自注意力机制可以知道“苹果”在这个语境下是水果,而不是科技公司,这是通过考虑“喜欢”和“我”等词来判断的。
一文搞懂 Transformer
2.1.5 BERT
BERT,全称Bidirectional Encoder Representation of Transformer,首次提出于《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》一文中。简单来说,BERT是使用了Transformer的encoder(即编码器)部分,因此也可以认为BERT就是Transformer的encoder部分。BERT既可以认为是一个生成Word Embedding的方法,也可以认为是像LSTM这样用于特征提取的模型结构。
详解BERT
2.2 通用层
2.2.1 Softmax
Softmax 是用于多类分类问题的激活函数,在多类分类问题中,超过两个类标签则需要类成员关系。对于长度为 K 的任意实向量,Softmax 可以将其压缩为长度为 K,值在(0,1)范围内,并且向量中元素的总和为 1 的实向量。
Softmax 与正常的 max 函数不同:max 函数仅输出最大值,但 Softmax 确保较小的值具有较小的概率,并且不会直接丢弃。我们可以认为它是 argmax 函数的概率版本或「soft」版本。
Softmax 函数的分母结合了原始输出值的所有因子,这意味着 Softmax 函数获得的各种概率彼此相关。
Softmax 激活函数的主要缺点是:
- 在零点不可微;
- 负输入的梯度为零,这意味着对于该区域的激活,权重不会在反向传播期间更新,因此会产生永不激活的死亡神经元。
2.2.2 Sigmoid
Sigmoid 函数的图像看起来像一个 S 形曲线。
(1)函数表达式如下: f ( z ) = 1 ( 1 + e − z ) f(z)=\frac{1}{(1+e^{-z})} f(z)=(1+e−z)1
(2)在什么情况下适合使用 Sigmoid 激活函数呢?
- Sigmoid 函数的输出范围是 0 到 1。由于输出值限定在 0 到 1,因此它对每个神经元的输出进行了归一化;
- 用于将预测概率作为输出的模型。由于概率的取值范围是 0 到 1,因此 Sigmoid 函数非常合适;
- 梯度平滑,避免「跳跃」的输出值;
- 函数是可微的。这意味着可以找到任意两个点的 sigmoid 曲线的斜率;
- 明确的预测,即非常接近 1 或 0。
(3)Sigmoid 激活函数有哪些缺点?
- 倾向于梯度消失;
- 函数输出不是以 0 为中心的,这会降低权重更新的效率;
- Sigmoid 函数执行指数运算,计算机运行得较慢。
2.2.3 ReLU
(1)ReLU 激活函数图像如上图所示,函数表达式如下:
(2)ReLU 函数是深度学习中较为流行的一种激活函数,相比于 sigmoid 函数和 tanh 函数,它具有如下优点:
- 当输入为正时,不存在梯度饱和问题。
- 计算速度快得多。ReLU 函数中只存在线性关系,因此它的计算速度比 sigmoid 和 tanh 更快。
(3)当然,它也有缺点:
- Dead ReLU 问题。当输入为负时,ReLU 完全失效,在正向传播过程中,这不是问题。有些区域很敏感,有些则不敏感。但是在反向传播过程中,如果输入负数,则梯度将完全为零,sigmoid 函数和 tanh 函数也具有相同的问题;
- 我们发现 ReLU 函数的输出为 0 或正数,这意味着 ReLU 函数不是以 0 为中心的函数。
2.2.4 Tanh/双曲正切激活函数
(1)tanh 激活函数的图像也是 S 形,表达式如下:
(2)tanh 是一个双曲正切函数。tanh 函数和 sigmoid 函数的曲线相对相似。但是它比 sigmoid 函数更有一些优势。
-
首先,当输入较大或较小时,输出几乎是平滑的并且梯度较小,这不利于权重更新。二者的区别在于输出间隔,tanh 的输出间隔为 1,并且整个函数以 0 为中心,比 sigmoid 函数更好;
-
在 tanh 图中,负输入将被强映射为负,而零输入被映射为接近零。
注意:在一般的二元分类问题中,tanh 函数用于隐藏层,而 sigmoid 函数用于输出层,但这并不是固定的,需要根据特定问题进行调整。
2.2.4 正则化 Dropout
在深度学习中,当参数过多而训练样本又比较少时,模型容易产生过拟合现象。过拟合是很多深度学习乃至机器学习算法的通病,具体表现为在训练集上预测准确率高,而在测试集上准确率大幅下降。2012 年,Hinton等人提出了Dropout算法,可以比较有效地缓解过拟合现象的发生,起到一定正则化的效果。
Dropout的基本思想如上图所示,在训练时,每个神经元以概率 p 保留,即以 1-p 的概率停止工作,每次前向传播保留下来的神经元都不同,这样可以使得模型不太依赖于某些局部特征,泛化性能更强。在测试时,为了保证相同的输出期望值,每个参数还要乘以p。当然还有另 外一种计算方式称为Inverted Dropout,即在训练时将保留下的神经元乘以1/p,这样测试时就不需要再改变权重。
至于Dropout为什么可以防止过拟合,可以从以下3个方面解释。
- 多模型的平均:不同的固定神经网络会有不同的过拟合,多个取平均则有可能让一些相反的拟合抵消掉,而Dropout每次都是不同的神经元失活,可以看做是多个模型的平均,类似于多数投票取胜的策略。
- 减少神经元间的依赖:由于两个神经元不一定同时有效,因此减少了特征之间的依赖,迫使网络学习有更为鲁棒的特征,因为神经网络不应该对特定的特征敏感,而应该从众多特征中学习更为共同的规律, 这也起到了正则化的效果。
- 生物进化:Dropout类似于性别在生物进化中的角色,物种为了适应环境变化,在繁衍时取雄性和雌性的各一半基因进行组合,这样可以适应更复杂的新环境,避免了单一基因的过拟合,当环境发生变化时也不至于灭绝。
Dropout被广泛应用到全连接层中,一般保留概率设置为0.5。
2.2.5 归一化 (BN、LN、IN、GN)
神经网络学习过程的本质就是为了学习数据分布,如果我们没有做归一化处理,那么每一批次训练数据的分布不一样,从大的方向上看,神经网络则需要在这多个分布中找到平衡点,从小的方向上看,由于每层网络输入数据分布在不断变化,这也会导致每层网络在找平衡点,显然,神经网络就很难收敛了。
当然,如果我们只是对输入的数据进行归一化处理(比如将输入的图像除以255,将其归到0到1之间),只能保证输入层数据分布是一样的,并不能保证每层网络输入数据分布是一样的,所以也需要在神经网络的中间层加入归一化处理。神经网络学习过程本质上就是为了学习数据分布,如果训练数据与测试数据的分布不同,网络的泛化能力就会严重降低。
四种归一化
在深度学习中,有多种归一化,接下来,我们先用一个示意图来形象的表现BN、LN、IN和GN的区别,在输入图片的维度为(NCHW)中,HW是被合成一个维度,这个是方便画出示意图,C和N各占一个维度。
(1)Batch Normalization
- 1.BN的计算就是把每个通道的NHW单独拿出来归一化处理
- 2.针对每个channel我们都有一组γ,β,所以可学习的参数为2*C
- 3.当batch size越小,BN的表现效果也越不好,因为计算过程中所得到的均值和方差不能代表全局
(2)Layer Normalizaiton
- 1.LN的计算就是把每个CHW单独拿出来归一化处理,不受batchsize 的影响
- 2.常用在RNN网络,但如果输入的特征区别很大,那么就不建议使用它做归一化处理
(3)Instance Normalization
- 1.IN的计算就是把每个HW单独拿出来归一化处理,不受通道和batchsize 的影响
- 2.常用在风格化迁移,但如果特征图可以用到通道之间的相关性,那么就不建议使用它做归一化处理
(4)Group Normalizatio
- 1.GN的计算就是把先把通道C分成G组,然后把每个gHW单独拿出来归一化处理,最后把G组归一化之后的数据合并成CHW
- 2.GN介于LN和IN之间,当然可以说LN和IN就是GN的特列,比如G的大小为1或者为C
BN、LN、IN和GN这四个归一化的计算流程几乎是一样的,可以分为四步:
- 1.计算出均值
- 2.计算出方差
- 3.归一化处理到均值为0,方差为1
- 4.变化重构,恢复出这一层网络所要学到的分布
2.2.6 池化层
在自然语言处理(NLP)领域,池化层(Pooling Layer)通常用于减少数据的维度,同时保留最重要的信息。池化层最初是为计算机视觉中的卷积神经网络(CNN)设计的,但在NLP中也得到了广泛应用,特别是在基于卷积或递归神经网络的模型中。
(1)池化层的作用
- 降低计算复杂度:通过减少特征图的空间尺寸,可以显著降低后续层的计算量和参数数量。
- 提供一定程度的平移不变性:池化操作可以在一定程度上忽略输入位置上的小变化,这有助于提高模型对不同位置出现相同模式的鲁棒性。
- 控制过拟合:通过减少参数数量,池化层可以帮助防止模型过度拟合训练数据。
(2)池化类型
-
最大池化(Max Pooling):从一个区域中选择最大值作为该区域的代表值。这种方法可以捕捉到最显著的特征,并且对于识别局部特征非常有效。
-
平均池化(Average Pooling):取区域内所有元素的平均值。这种方式比较温和,适用于希望保留更多上下文信息的情况。
-
全局池化(Global Pooling):当应用于整个特征图时,称为全局池化。它可以是全局最大池化或全局平均池化,通常用于将固定长度的向量输出给分类器或其他全连接层。
(3)在NLP中的应用
-
文本分类:在使用CNN进行文本分类的任务中,池化层可以用来提取句子级别的特征表示。例如,在字符级或词级的卷积之后,可以通过池化操作获得整个句子的固定长度表示。
-
序列建模:在某些情况下,池化也可以用在递归神经网络(RNN)之上,以获取更抽象级别的表示。不过,由于RNN本身具有顺序处理能力,因此直接在其上应用池化不如在CNN中常见。
-
注意力机制:尽管不是传统意义上的池化,但一些现代NLP模型使用了类似于池化的机制来聚焦于最重要部分的信息。例如,在变压器架构中,多头自注意力机制允许模型关注输入序列的不同部分,从而实现了一种软性的“池化”。
(4)实现细节
-
窗口大小与步幅:定义了池化操作覆盖的区域以及移动的距离。较大的窗口可以更大幅度地减少空间分辨率,而较小的窗口则能更好地保持原始结构。
-
边界填充:有时为了保持输出尺寸不变或者达到特定的输出尺寸,会在输入边缘添加零值(Padding)。
总之,池化层在NLP中是一个重要的组件,它帮助简化模型、增强泛化能力和提高效率。随着研究的发展,新的变体和技术也在不断涌现,如动态池化等,进一步丰富了这一领域的工具箱。
2.3 深度学习训练知识
2.3.1 前向传播
以下是RNN的简单任务的前向传播过程:
- 初始化:开始时,权重和偏置项被随机初始化或者通过预训练得到。
逐层计算: - 嵌入层:将输入的词索引转换成对应的词向量。
- 隐藏层:根据所选模型的不同,信息经过不同的处理方式。例如,在RNN中,当前时刻的状态由前一时刻的状态和当前输入共同决定;而在Transformer中,则通过自注意力机制计算出新的特征表示。
- 激活函数:在某些层后应用激活函数(如ReLU, Sigmoid, Tanh等)引入非线性因素。
- 输出层:最后,通过一个适合于特定任务的输出层(分类任务通常是softmax层,回归任务则可能是单个神经元)生成最终结果。
前向传播其实就是你自己搭建的模型中forward函数的计算过程。
2.3.2 损失函数
在自然语言处理(NLP)中,损失函数是用来衡量模型预测输出与实际标签之间差异的度量。选择合适的损失函数对于训练有效的模型至关重要。下面是一些常用的NLP任务中的损失函数及其详细介绍:
(1)交叉熵损失 (Cross-Entropy Loss)
交叉熵损失是最常见的损失函数之一,在分类问题中尤其有用。它用于量化两个概率分布之间的差异:一个是模型给出的概率分布,另一个是真实标签的概率分布。
公式:
对于单个样本,如果真实标签是 y y y,模型预测的概率分布为 y ^ \hat{y} y^,那么二分类交叉熵损失可以表示为: L = − [ y log ( y ^ ) + ( 1 − y ) log ( 1 − y ^ ) ] L = -[y \log(\hat{y}) + (1 - y) \log(1 - \hat{y})] L=−[ylog(y^)+(1−y)log(1−y^)]
对于多分类问题,通常使用softmax作为激活函数来保证输出是一个合法的概率分布,此时交叉熵损失可以写作: L = − ∑ i y i log ( y ^ i ) L = -\sum_{i} y_i \log(\hat{y}_i) L=−∑iyilog(y^i)
其中 y i y_i yi 是第 i i i 类的真实标签(0或1), y ^ i \hat{y}_i y^i 是模型预测该类别的概率。
应用场景
- 文本分类
- 情感分析
- 机器翻译
(2)均方误差 (Mean Squared Error, MSE)
MSE主要用于回归问题,测量预测值与实际值之间的平均平方差。
公式:
L = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 L = \frac{1}{n} \sum_{i=1}^{n}(y_i - \hat{y}_i)^2 L=n1∑i=1n(yi−y^i)2
其中 y i y_i yi 是真实值, y ^ i \hat{y}_i y^i 是预测值。
应用场景
- 情绪评分预测
- 价格预测
(3)三元组损失 (Triplet Loss)
这种损失函数常用于学习嵌入空间中的距离度量,特别是在面部识别和句子相似性任务中。
公式:
给定一个锚点样本、一个正样本(与锚点同类)和一个负样本(与锚点不同类),三元组损失试图让正样本比负样本更接近锚点。
L = max ( 0 , d ( a , p ) − d ( a , n ) + α ) L = \max(0, d(a, p) - d(a, n) + \alpha) L=max(0,d(a,p)−d(a,n)+α)
其中 d ( x , y ) d(x, y)