文章目录
- 拓展知识
- 基础名词解释(语义库更新)
- 机器学习任务流程
- 模型训练基本流程
- 模型训练详细流程
- 正向传播与反向传播
- 正向传播-求误差值
- 反向传播-求参数值
- 学习率
- 激活函数
- 激活函数-为什么希望激活函数输出均值为0?
- 激活函数 — softmax & tanh
- 激活函数 — ReLU(MVP:简单粗暴)
- 激活函数 — Swish(ReLU进阶版,用的最多)
- 损失函数
- 损失函数 — MSE & MAE
- 损失函数 — 交叉熵损失
- 输出函数
- 优化器
- 初步总结
拓展知识
理想情况下,我们希望模型能够学习到数据的内在规律和结构,以便在未见过的数据上进行准确的预测或分类。
- 模型训练最终获得的产出就是模型结构+一批权重参数和阈值集合。
- 模型训练和应用都需要计算-算力。
- 模型最终训练效果无法被解释推理过程和推理依据。
实际上大多数情况是黑盒训练,配置好激活函数,损失函数等参数,扔进去数据,模型自动根据配置调权重参数和阈值等。
通俗理解
自监督学习-暴力出奇迹:自监督硬找文本规律,基于庞大的数据量实现的”过拟合“行为,互联网全部数据都是训练集那么拟合训练集就变成正确的事情了。
硬找文本规律训练语言理解能力,文本挖坑硬填训练语言生成能力。
相当于背过全网知识,基于存量知识再拼接总结生成
AIGC技术的核心思想是利用人工智能算法生成具有一定创意和质量的内容。通过训练模型和大量数据的学习,AIGC可以根据输入的条件或指导,生成与之相关的内容。例如,通过输入关键词、描述或样本,AIGC可以生成与之相匹配的文章、图像、音频等。
发展障碍
硬件和能源决定大模型发展上限。
实际上核心问题:显卡-算力
理论上最终上限是能源上限,目前是算力限制(伪垄断导致,沙子有的是显卡随便造,算力应该是没有上限的)。
硬件架构:能源(电能)+内存(大模型架构)+显卡(算力)
通用模型的局限性
ChatGPT数据来源都是公网,因此只能解决通用公众问题,要想建立解决业务问题模型需要用公司内部数据训练专用模型。
因此若公司想建立专用模型,需要各自搭建训练专属模型。
基础名词解释(语义库更新)
样本:一条数据例子;
特征:被观测对象的可测量特性,例如西瓜的颜色、瓜蒂、纹路、敲击声等;
特征向量:用一个 d 维向量表征一个样本的所有或部分特征;(ax,by,cz,…,zn);
1、 一个维度就是一个特征,维度越多,变量越多,未知参数越多,事物特征被分析的越彻底。
2、将具体的事物拆分为d维特征向量就是数据标注。
标签(label)/真实值:样本特征对应的真实类型或者真实取值,即正确答案;
数据集(dataset):多条样本组成的集合;
训练集(train):用于训练模型的数据集合;
评估集(eval):用于在训练过程中周期性评估模型效果的数据集合;
测试集(test):用于在训练完成后评估最终模型效果的数据集合;
训练集和评估集是训练模型时用的数据集,分别起学习和验证的作用。
模型:可以从数据中学习到的,可以实现特定功能/映射的函数;
误差/损失:样本真实值与预测值之间的误差.;
预测值:样本输入模型后输出的结果;
模型训练:使用训练数据集对模型参数进行迭代更新的过程;
模型收敛:任意输入样本对应的预测结果与真实标签之间的误差稳定;
模型评估:使用测试数据和评估指标对训练完成的模型的效果进行评估的过程;
模型推理/预测:使用训练好的模型对数据进行预测的过程;
模型部署:使用服务加载训练好的模型,对外提供推理服务;
机器学习任务流程
注意事项:
- 数据集分类是随机分配
- ChatGPT的出现极大的释放了数据标注的人工量。
模型训练基本流程
1、数据标注
简单来说:数据标注就是将具体事物拆分为多维度变量值(瓜茎卷曲程度:0.8,瓜皮颜色:0.6,瓜尺寸:0.9),代入模型(ax+by+cz=甜|酸)中能够求解出参数值(各个维度的权重值对于正确答案的影响)。
特征:被观测对象的可测量特性,例如西瓜的颜色、瓜蒂、纹路、敲击声等;
特征向量:用一个 d 维向量表征一个样本的所有或部分特征;(ax,by,cz,…,zn);总结:
1、一个维度就是一个特征,维度越多,未知参数越多,事物特征被分析的越彻底。
2、将具体的事物拆分为d维特征向量就是数据标注。
2、总训练集分为多个Batch size。
3、求和(权重参数*特征变量值)=预测值。
4、训练完之后根据真实值和预测值的Loss函数评估,不断调试不断更新参数。
模型参数一开始是随机生成的或者用已有可参考参数值。
Loss函数:衡量真实值和预测值误差到底是多少损失值(量化)
模型训练详细流程
batch_size:一次性输入到模型的样本条数(上图是batch_size=1的情况)。
batch_size大小决定GPU的消耗情况。
Batch size 是一次向模型输入的数据数量,Batch size 越大,模型一次处理的数据量越大,能够更快的运行完一个Epoch,反之运行完一个Epoch更慢。
由于模型一次是根据一个 Batch size 的数据计算 Loss,然后更新模型参数,如果Batch size 过小,单个 Batch 可能与整个数据的分布有较大差异,会带来较大的噪声,导致模型难以收敛(特例的影响)。
与此同时,Batch size 越大,模型单个 Step 加载的数据量越大,对于 GPU 显存的占用也越大,当 GPU 显存不够充足的情况下,较大的 Batch size 会导致 OOM(内存溢出),因此,需要针对实际的硬件情况,设置合理的 Batch size 取值。
总结:Batch size越大越好
在合理范围内,更大的 Batch size 能够:
- 提高内存利用率,提高并行化效率;
- 一个 Epoch 所需的迭代次数变少,减少训练时间;
- 梯度计算更加稳定,训练曲线更平滑,下降方向更准,能够取得更好的效果;
对于传统模型,在较多场景中,较小的 Batch size 能够取得更好的模型性能;
对于大模型,往往更大的 Batch size 能够取得更好的性能。
Batch size中样本类型比例应该尽量切合Epoch的分布比例。
每一层layer其实是相同结构的模型,上一层分析样本后下一层更加递进分析上一层的分析结果(特征向量)。
1、模型结构设置
#设置神经网络结构,各层顺序相连
model = tf.keras.models.Sequential([
#下面把每个输入的图片数据展平,从28*28变为784*1的形式tf.keras.layers.Flatten(input_shape=(28, 28)),
#下面是一个全连接层,128个节点,激活函数采用Relu tf.keras.layers.Dense(128, activation=tf.nn.relu),
# 下面让20%的节点无效,不与下一层连接tf.keras.layers.Dropout(0.2),
# 下面是一个全连接层,10个节点,激活函数采用softmax tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])2、主要训练参数
#编译模型(为模型选择优化器、目标函数和性能评价指标)
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
#训练模型-训练集
model = model.fit(x_train, y_train, epochs=1)
#评估模型正确率-评估集
model.evaluate(x_test, y_test)
Keras中的常用层举例
- Flatten层
用来将输入“压平”,即把多维的输入一维化,常用在数据输入或从卷积层到全连接层的过渡。 - Dense层(全连接层)
对上一层的神经元进行全部连接,实现特征的非线性组合。跟下一层的神经元也是全连接的。 - Activation层
激活层对一个层的输出施加激活函数。 在Keras中使⽤激活对象有两种方法: ⼀是单独定义⼀个激活层;二是在前置层里面通过激活选项来定义所需的激活函数。 - Dropout层
为输入数据施加Dropout。Dropout在训练过程中每次更新参数时随机断开一定百分比(rate)的输入神经元,用于防止过拟合
Compile参数
- loss:损失函数,或称目标函数,是神经网络中的性能函数,优化的目标是使损失函数最小化。具体取值在tf.keras.losses中
- optimizer:优化器,主要是各种梯度下降算法,优化的目标是使loss最小,具体取值在tf.keras.optimizers中
- metrics:评价指标,确定使用哪些指标展现模型的性能,具体取值在tf.keras.metrics中
正向传播与反向传播
正向传播-求误差值
Loss函数:衡量真实值和预测值误差到底是多少损失值(量化)
求和(权重参数*特征变量值)=预测值。
Loss函数计算得出真实值和预测值的正数误差后(平方,绝对值),接下来要做的就是将误差L降低为最小,有请梯度函数。
反向传播-求参数值
梯度:梯度是一个向量(矢量),函数在一点处沿着该点的梯度方向变化最快,变化率最大。
换而言之,自变量沿着梯度方向变化,能够使因变量(函数值)变化最大。
实际就是求导找到本次Batch size所形成的损失函数的最小值对应的Wn参数值。
偏导数单独求解每个参数w的变化。
阿尔法是学习率,决定参数w更新幅度。
更新参数w的目的是使L值获得最大程度降低。
学习率
学习率(Learning Rate,LR)决定了模型参数的更新幅度,学习率越高,模型参数更新越激进,即相同 Loss 对模型参数产生的调整幅度越大,反之越小。
注意:
如果学习率太小,会导致网络 loss 下降非常慢;
如果学习率太大,那么参数更新的幅度就非常大,产生振荡,导致网络收敛到局部最优点,或者 loss 不降反增。
激活函数
线性函数是一次函数的别称,则非线性函数即函数图像不是一条直线的函数。非线性函数包括指数函数、幂函数、对数函数、多项式函数等等基本初等函数以及他们组成的复合函数。
激活函数是多层神经网络的基础,保证多层网络不退化成线性网络。
下图为激活(起点)函数为简单变量和常数的情况, 最终y表达式还是一个线性函数。
线性模型的表达能力不够,激活函数使得神经网络可以逼近其他的任何非线性函数, 这样可以使得神经网络应用到更多非线性模型中。
激活函数 — sigmoid
- sigmoid函数具有软饱和特性,在正负饱和区的梯度 都接近于0,只在0附近有比较好的激活特性;
- sigmoid导数值最大0.25,也就是反向传播过程中,
每层至少有75%的损失,这使得当sigmoid被用在隐藏层的时候,会导致梯度消失(一般5层之内就会产生) ; - 函数输出不以0为中心,也就是输出均值不为0,会导致参数更新效率降低;
- sigmoid函数涉及指数运算,导致计算速度较慢。
激活函数-为什么希望激活函数输出均值为0?
均值为零说明每个激活函数节点输出值有正有负,更具备多样性,调优更加灵活有效。
在上面的参数 wi 更新公式中, 对于所有 wi 都是一样的,xi 是 i - 1 层的激活函数的输出,如果像 sigmoid 一样,输出值只有正值,那么对于第 i 层的所有 wi ,其更新方向完全一致,模型为了收敛,会走 Z 字形来逼近最优解(一会全变大,一会全变小)。
激活函数 — softmax & tanh
softmax
tanh
激活函数 — ReLU(MVP:简单粗暴)
- ReLU 是一个分段线性函数,因此是非线性函数;
- ReLU 的发明是深度学习领域最重要的突破之一;
- ReLU 不存在梯度消失问题;
- ReLU计算成本低,收敛速度比 sigmoid 快6倍;
- 函数输出不以0为中心,也就是输出均值不为0,会导致参数更新效率降低;
最大问题:存在 dead ReLU 问题(输入 ReLU 有负值时,ReLU 输出为0,梯度在反向传播期间无法流动,导致权重不会更新);
激活函数 — Swish(ReLU进阶版,用的最多)
损失函数
损失函数(loss function)就是用来度量模型的预测值f(x)与真实值Y的差异程度(损失值) 的运算函数,它是一个非负实值函数。
损失函数仅用于模型训练阶段,得到损失值后,通过反向传播来更新参数,从而降低预 测值与真实值之间的损失值,从而提升模型性能。
整个模型训练的过程就是在通过不断更新参数,使得损失函数不断逼近全局最优点(全局最小值)。
不同类型的任务会定义不同的损失函数,例如回归任务重的MAE、MSE,分类任务中的 交叉熵损失等。
损失函数 — MSE & MAE
均方误差(mean squared error,MSE),也叫平方损失或 L2 损失,常用在最小二乘法中,它的思想是使得各个训练点到最优拟合线的距离最小(平方和最小)。
平均绝对误差(Mean Absolute Error,MAE)是所有单个观测值与算术平均值的绝对值的平均,也被称为 L1 loss,常用于回归问题中。
损失函数 — 交叉熵损失
log 函数是很多损失函数中的重要组成部分,对于 log 函数,默认的底数 a 是 e,也就是损失函数中使用的 log 函数默认a>1。
【二分类】
N为batch_size的样本数,求本批batch_size的误差平均值。
其中,yi 为样本 i 的真实标签,正类为 1,负类为 0;pi 表示样本 i 预测为正类的概率。
【多分类】
N为batch_size的样本数,求本批batch_size的误差平均值。
其中,M 为类别数量;yic 符号函数,样本 i 真实类别等于 c 则为 1,否则为 0;预测样本 i 属于类别的预测概率.。
实例解释
二分类
假设有一个二分类任务,正类为1,负类为0,存在一个正样本A,当模型输出其为正类 的概率为0.8时,交叉熵损失为:
𝑜 = − (1 ∗ 𝑜(0.8) + 0 ∗ 𝑜(0.2)) = − 𝑜(0.8) = 0.0969
当模型输出其为正类的概率为0.5时,交叉熵损失为:
𝑜 = − (1 ∗ 𝑜(0.5) + 0 ∗ 𝑜(0.5)) = − 𝑜(0.5) = 0.3010
由此可见,当模型预测的误差越大时,交叉熵损失函数计算得到的损失越大。
因为:0<x<1时,log求导值大于1,放大原本误差。
0.8-0.6<|log(0.8)-log(0.6)|
多分类
有如下的交叉熵损失计算:
对所有样本loss求平均:
输出函数
对于不同的分类任务,交叉熵损失函数使用不同的激活函数(sigmoid/softmax)获得概率输出:
【二分类】
使用sigmoid和softmax均可,注意在二分类中,Sigmoid函数,我们可以当作成它是对 一个类别的“建模.”,另一个相对的类别就直接通过1减去得到。而softmax函数,是对两个类别建模,同样的,得到两个类别的概率之和是1。
【单标签多分类】
交叉熵损失函数使用softmax获取概率输出(互斥输出)。
【多标签多分类】
交叉熵损失函数使用sigmoid获取概率输出。
优化器
优化器就是在深度学习反向传播过程中,指引损失函数(目标函数)的各个参数往正确 的方向更新合适的大小,使得更新后的各个参数让损失函数(目标函数)值不断逼近全局最小。
初步总结
正反向传播整体流程
1、模型结构设置
#设置神经网络结构,各层顺序相连
model = tf.keras.models.Sequential([
#下面把每个输入的图片数据展平,从28*28变为784*1的形式tf.keras.layers.Flatten(input_shape=(28, 28)),
#下面是一个全连接层,128个节点,激活函数采用Relu tf.keras.layers.Dense(128, activation=tf.nn.relu),
# 下面让20%的节点无效,不与下一层连接tf.keras.layers.Dropout(0.2),
# 下面是一个全连接层,10个节点,激活函数采用softmax tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])2、主要训练参数
#编译模型(为模型选择优化器、目标函数和性能评价指标)
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
#训练模型-训练集
model = model.fit(x_train, y_train, epochs=1)
#评估模型正确率-评估集
model.evaluate(x_test, y_test)
Keras中的常用层举例
- Flatten层
用来将输入“压平”,即把多维的输入一维化,常用在数据输入或从卷积层到全连接层的过渡。 - Dense层(全连接层)
对上一层的神经元进行全部连接,实现特征的非线性组合。跟下一层的神经元也是全连接的。 - Activation层
激活层对一个层的输出施加激活函数。 在Keras中使⽤激活对象有两种方法: ⼀是单独定义⼀个激活层;二是在前置层里面通过激活选项来定义所需的激活函数。 - Dropout层
为输入数据施加Dropout。Dropout在训练过程中每次更新参数时随机断开一定百分比(rate)的输入神经元,用于防止过拟合
Compile参数
- loss:损失函数,或称目标函数,是神经网络中的性能函数,优化的目标是使损失函数最小化。具体取值在tf.keras.losses中
- optimizer:优化器,主要是各种梯度下降算法,优化的目标是使loss最小,具体取值在tf.keras.optimizers中
- metrics:评价指标,确定使用哪些指标展现模型的性能,具体取值在tf.keras.metrics中