1.反向传播算法
-
背景
反向传播算法是当前深度学习的核心技术。 -
神经网络
- x是输入,o是输出,w是需要训练的参数(w有初始值)
- 三层全连接的神经网络:输入层、隐藏层、输出层
-
激活函数
f ( x ) = 1 1 + x − 1 f(x)=\frac{1}{1+x^{-1}} f(x)=1+x−11 (sigmod函数)
激活函数必须是非线性的
-
前向传播
z 1 = x 1 ∗ w 1 + x 2 ∗ w 3 + b 1 z_1=x_1*w_1+x_2*w_3+b_1 z1=x1∗w1+x2∗w3+b1
f ( z 1 ) = 1 1 + z 1 − 1 f(z_1)=\frac{1}{1+z_1^{-1}} f(z1)=1+z1−11
i 1 = f ( z 1 ) ∗ w 5 + f ( z 2 ) ∗ w 7 + b 2 i_1=f(z_1)*w_5+f(z_2)*w_7+b_2 i1=f(z1)∗w5+f(z2)∗w7+b2
o 1 = f ( i 1 ) = 1 1 + i 1 − 1 o_1=f(i_1)=\frac{1}{1+i_1^{-1}} o1=f(i1)=1+i1−11
注:b为常数
-
损失函数
E = 1 / 2 ∗ ( o 1 − t a r g e t 1 ) 2 + 1 / 2 ∗ ( o 2 − t a r g e t 2 ) 2 E=1/2*(o_1-target_1)^2+1/2*(o_2-target_2)^2 E=1/2∗(o1−target1)2+1/2∗(o2−target2)2
-
梯度计算
链式求导法则: ∂ ( E ) ∂ ( w 5 ) = ∂ ( E ) ∂ ( o 1 ) ∗ ∂ ( o 1 ) ∂ ( i 1 ) ∗ ∂ ( i 1 ) ∂ ( w 5 ) \frac{\partial(E)}{\partial(w_5)} = \frac{\partial(E)}{\partial(o_1)}*\frac{\partial(o_1)}{\partial(i_1)}* \frac{\partial(i_1)}{\partial(w_5)} ∂(w5)∂(E)=∂(o1)∂(E)∗∂(i1)∂(o1)∗∂(w5)∂(i1)
∂ ( E ) ∂ ( o 1 ) = − ( o 1 − t a r g e t 1 ) \frac{\partial(E)}{\partial(o_1)}= -(o_1-target_1) ∂(o1)∂(E)=−(o1−target1)
∂ ( o 1 ) ∂ ( i 1 ) = f ( z 1 ) ∗ ( 1 − f ( z 1 ) ) \frac{\partial(o_1)}{\partial(i_1)}=f(z_1)*(1-f(z_1)) ∂(i1)∂(o1)=f(z1)∗(1−f(z1))
∂ ( i 1 ) ∂ ( w 5 ) = f ( z 1 ) \frac{\partial(i_1)}{\partial(w_5)}=f(z_1) ∂(w5)∂(i1)=f(z1)
-
反向传播
沿着梯度相反的方向更新参数:
w 5 + = w 5 − η ∗ ∂ ( E ) ∂ ( w 5 ) w_5^+=w_5-\eta * \frac{\partial(E)}{\partial(w_5)} w5+=w5−η∗∂(w5)∂(E)
学习率 η \eta η不可太大也不可太小,太大会导致震荡,太小会导致收敛速度慢,太大错过最优点。
-
反复迭代上述过程,直至E值达到全局最小(大)值。
-
常见的神经网络层
- 全连接层
- 卷积层
- 池化层
- 循环层
- dropout层
- 归一化
每个模型的参数量,层数,神经元连接方式,激活函数,损失函数,参数更新方式都可能不同。
-
大模型
-
通过训练模型来学习从输入到输出的映射关系。
-
这种映射关系通常由一组权重和偏置参数来定义,这些参数是通过优化损失函数来获得的。
-
通过调整这些参数,模型可以逐渐改进其预测和生成结果的能力。
-
大模型和传统神经网络最本质区别是什么?
规模效应带来的涌现能力是最本质区别。传统模型依赖专门设计的架构解决特定任务,大模型通过海量参数和数据习得通用能力,并能迁移到未见过的任务。
-
2.训练深度神经网络
深度神经网络由多层神经元组成,每层神经元都可以学习到输入数据的不同特征。
图像识别,语音识别、自然语言处理、自动驾驶、推荐系统、游戏等都广泛应用。
-
算法+算力+数据
深度学习能成功的三大马车。
- 合适的的数据:
- 数据标注、数据清洗、数据增强、数据裁剪
- 合适的网络:
- 参数量大小,网络层数
- 参数初始化:随机、平均、归一化
- 激活函数、损失函数、学习率、优化器
- 参数与GPU显存使用直接相关
- 合适的神经元连接方式:
-
卷积神经网络
-
循环神经网络
-
- 合适的训练方式:
-
预训练、迁移学习、微调,生成对抗;
-
深度学习四大范式 :深度监督、无监督、半监督、强化学习;
- https://developer.baidu.com/article/details/3034262
-
强化学习:
- 智能体与环境的不断交互(即在给定状态采取动作),进而获得奖励,此时环境从一个状态转移到下一个状态。
- 智能体通过不断优化自身动作策略,以期待最大化其长期回报或收益(奖励之和)。
-
- 合适的的数据:
-
常见的问题:
- 过拟合是指模型过于拟合训练数据,而欠拟合是指模型拟合不足
- 梯度消失是指在反向传播过程中,梯度值随着层的深度而减小,导致深层神经元的梯度值接近于零
- 梯度爆炸是指在反向传播过程中,梯度值随着层的深度而增大,导致深层神经元的梯度值变得非常大
-
常见的深度学习框架
- TensorFlow:谷歌
- PyTorch:Facebook
- MXNet:亚马逊
- Caffe:伯克利大学
- Horovod:优化分布式训练的框架
这些框架提供了丰富的API和工具用于构建、训练、验证、评价模型。
3.大语言模型构建
-
NLP模型发展:统计模型(马尔可夫假设)-> 神经网络(循环神经网络) -> 预训练语言模型 -> 大语言模型(超大参数量,千、万亿级别)
-
大语言模型:在海量无标注文本数据上预训练的得到的大型预训练语言模型 —>强大的语言理解能力和复杂任务求解能力。
- 扩展法则:小算力去预估大算力后性能,早期性能去预估后期性能。–>减少试验成本
- 涌现能力:模型扩展到一定规模时,模型的特定的任务性能突然出现显著跃升的趋势(无法解释!)。
- 上下文学习
- 指令遵循:听人的话执行任务
- 逐步推理:思维连–>引入中间推理步骤做数学应用题
-
相关资源:
- 模型检查点
- 公共API:可以采用自己的数据来微调,以便更好地适用于个性化应用场景
- 数据集
- 预训练数据集:网页、书籍、代码数据集
- 指令微调数据集
- 人类对齐数据集
3.1大规模预训练
编码世界,知识注入(几T数据,清洗、词元化–>算力消耗)
3.1.1数据准备
- 数据:文本、百科、代码
- 数据预处理:质量过滤,敏感内容过滤,去重
- 词元化:将原始文本分割成模型可识别和建模的词元序列,用于模型输入。把文本拆转成更小的单元,再转成数字。
- 数据调度:各种数据的混合比例和用与训练的顺序
3.1.2模型架构
当前的大语言模型都是基于Tansformer模型设计的。
-
Transformer:由多层的多头自注意力模块堆叠而成的神经网络模型。
-
循环神经网络的劣势
- 输出取决于先前的隐藏状态和当前的输入,要等上一个步骤完成后,才能进行当前的计算。
- RNN不擅长处理长序列,因为难以捕捉到长距离依赖性的语义关系。
-
transformoer架构
- 编解码器,Transformer通常包括一个编码器用于处理输入序列和一个解码器用于生成输出序列,这使其适用于序列到序列的任务,如机器翻译。
- 输入编码:转化成具有位置信息的词向量,因为 Transformer 不采用 RNN 的结构,而是使用全局信息,不能利用单词的顺序信息,而这部分信息对于 NLP 来说非常重要。所以Transformer 中使用位置 Embedding 保存单词在序列中的相对或绝对位置。
- 多个编码器串联,多个解码器串联
-
tansformer实现
- 前馈网络层:引入非线性映射变换,提升模型表达能力,更好捕获复杂交互关系。
- ADD & Nomral层:解决网络训练中的一些问题。
- softmax层:输出预测词的概率
- 自注意力机制:自注意力机制允许模型根据输入序列中的不同部分来赋予不同的注意权重,从而更好地捕捉语义关系。
-
Self-Attention 接收的是输入(单词的表示向量x组成的矩阵X) 或者上一个 Encoder block 的输出。而Q,K,V是输入和矩阵的乘积。
-
$Q_1 = W_Q * X_1; K_1 = W_KX_1; V_1 = W_KX_1 $ (可并行计算 GPU,TPU)
-
Z 1 = A ( Q , K , V ) Z_1 = A(Q,K,V) Z1=A(Q,K,V) (需要拿输入句子中的每个单词对本单词打分,帮助模型对本单词更好地进行编码)
-
卷积神经网络代替循环神经网络:卷积层多次层叠后,可以获取更大的上下文信息。
-
- 多头自注意力机制:多个Self-Attention并列,对输入X 生成多个Z,多个Z拼接再乘一个权重矩阵,得到输出。
核心创新,建模任意词元的交互关系,进而有效捕获长程依赖关系,具有更强的序列建模能力。
每个单元关注不同的地方。 - Decoder block 的第一个 Multi-Head Attention 采用了 Masked 操作。
因为在翻译的过程中是顺序翻译的,即翻译完第 i 个单词,才可 以翻译第 i+1 个单词。
通过 Masked 操作可以防止第 i 个单词知道 i+1 个单词之后的信息。 - outputs 是之前预测的输出结果。(根据之前的输出求解此次的输出)
-
-
大模型:使用了更长的向量维度,更深的层数,更多参数的解码器架构。
- 大语言模型是Transformer架构的规模化扩展,通过量变引发质变,获得了更强大的语言理解和生成能
- GPT1为例,它有1.17亿个参数,到了GPT2,参数有15亿个参数。而GPT3参数有1750亿个参数,96层和96个头数,GPT4有1.8万亿参数。
- 编解码器可以单独使用
- BERT为编码器架构
- GPT为解码器架构
3.1.3 模型预训练方法
- 语言建模:预测下一个单词的能力
- 参数优化设置:
- 大批次, 逐渐增大批次大小(尽快收敛->稳定收敛)
- 学习率从一个非常小的值现行增加到一个较大阈值,再逐步衰减
- 优化器:梯度修正
- 其他:模型存档,dropout等
- 其他训练技术(3D并行)
- 数据并行:将模型参数和优化器分到多个GPU,在每个GPU上获取梯度,使用梯度平均值更新所有GPU上的参数。
- 流水线并行:不同层的参数分配到不同GPU,累积前向传播多个批次后,再更新参数。
- 张量并行:矩阵运算 I W = [ I W 1 , I W 2 ] IW=[IW1,IW2] IW=[IW1,IW2],将矩阵W分解成W1,W2两个矩阵,将W1,W2放置到两个GPU上,并行执行两个矩阵运算,通过GPU通信,合并结果。
3.2指令微调
- 有监督训练,使用任务输入与输出的配对数据(模仿学习,激发作用)–>通过问答进行任务求解。
- 让模型听懂人的指令。
- 数据集仅预训练过程万分之一的大小。
- 指令数据集
- 输入:数据(language)+任务描述(翻译成中文);输出:语言
- NLP数据集:从公开NLP数据集中构建(人工标注任务描述)
- 日常对话数据集:从用户给模型的指令(对话)中,构建数据集
- 合成数据集:半自动化构建:提示模型,让模型帮忙生成数据集,再过滤
- 引入思维链数据:算数推理等
- 输入:数据(language)+任务描述(翻译成中文);输出:语言
- 指令微调的作用
- 小训练模型能力大提升
- 解决未见过的任务:如补全英文句子->补全日文句子
- 面向特定领域指令微调
- 指令微调训练
- 较小的学习率和批次小幅度调整
- 数据组织:
- 样本比例混合(NLP、日常对话、合成数据集三个数据集混合)
- 多阶段:三个数据集先后训练
- 指令微调阶段引入预训练数据->模型更加稳定
3.3人类对齐
- 对齐标注难以通过形式化的目标来优化,引入人类反馈指导。
- 基于人类反馈的强化学习,训练符合人类价值观的模型,防止产生冒犯偏见和事实错误文本。
- 标准
- 有用性:简洁高效完成任务,了解用户真实意图
- 诚实性:客观,准确,适当表达不确定性避免误导
- 无害性:消除冒犯性和歧视性,查询敏感主图时,应拒绝
- 步骤
- 奖励模型训练
- 使用模型生成多个候选输出,人为标注排序
- 训练模型来预测这个排序,有效的拟合人类偏好
- 强化学习训练
- 强化学习算法:策略梯度,PPO
- 奖励模型训练
3.4 评测
- 建模能力:反映模型对语言的基本理解和建模能力(可根据前文预测后文的能力)。困惑度
- 分类任务和问答:真正例,真负例,假正例,假负例。精确率,召回率,F1分数。
- 文本生成:衡量文本生成的质量,连贯性逻辑性等。BLEU(生成文本和参考范文之间的相似度)
- 执行任务能力:成功率(比如代码生成后能通过编译的成功率)
- 每一种能力的测评,都有相关的公开数据集。
3.5 提示学习
经过预训练、指令微调和人类对齐后,提示学习方法可有效地使用大语言模型解决实际任务。
- 人工提示
任务描述:清晰具体
输入数据:明确的数字
上下文信息:提供参考文档
提示策略:如“让我们一步步思考” - 自动提示:将提示词作为可训练参数
- 上下文学习:将示例样本格式化的输入到大模型
3.5 AI agent
参考文献
- 词元化:https://zhuanlan.zhihu.com/p/17845281626
- 反向传播算法:https://blog.csdn.net/ft_sunshine/article/details/90221691
- 大模型概述:https://llmbook-zh.github.io/
- transformer:
- https://zhuanlan.zhihu.com/p/163909808
- https://blog.csdn.net/weixin_42475060/article/details/121101749
- https://blog.csdn.net/weixin_42475060/article/details/121101749
- https://blog.51cto.com/u_16213711/13024654
- https://blog.csdn.net/weixin_42475060/article/details/121101749