AI 基础入门・程序员极简笔记
线性函数
\(f(x)=wx+b\)
非线性函数
\(f(x)=g(wx+b)\) \(f(x)=(wx+b)^2\)
激活函数
线性函数外层套个非线性函数
神经元的输入是「线性加权和」(z = w1x1 + w2x2 + ... + b);
激活函数就是给这个线性结果 “加非线性 buff”,让神经网络能学习复杂规律。
\(f(x)=g(wx+b)\) \(f(x)=(wx+b)^2\)
神经元
一个神经元 = 一次线性变换 + 一次激活函数
一个线性变换套一个激活函数 也就是 一个输入层x 一个输出层y
\(f(x)=g(wx+b)\) 这就是一个神经元
神经网络
一个线性变换套一个激活函数 之后外层再套线性变换跟激活函数 中间变换的部分就叫隐藏层
神经元的 输入层,输出层,隐藏层 加一起叫神经网络
前向传播
x输入层 -> 隐藏层 -> y输出层
损失函数
评判数据的拟合程度
预测数据&真实数据 == 差异、拟合度
表示预测数据与真实数据误差的函数叫损失函数
\(\sum_{i=1}^N|y_i-\hat y_i|\)
均方误差(MSE)
均方误差,损失函数的一种,从参数视角的关于w,b的函数
\(L(w,b) = \frac{1}{N}\sum_{i=1}^N(y_i-\hat y_i)^2\)
线性回归
通过寻找一个线性函数来拟合x和y的关系
例:数据:\((x_1,y_1)(x_2,y2)\cdots (x_n,y_n)\)
线性模型:\(y=wx+b\)
损失函数:\(L(w,b) = \frac{1}{N}\sum_{i=1}^N(y_i-\hat y_i)^2\)
目标:求解L最小的w和b的值
- 公式去掉b(二维抛物线),只有一个参数就是求导。一元函数求最小值(极值),使导数等于0
- 公式w,b(三维开口向上的碗状)两个参数就要求偏导,多元函数求最小值(极值),使偏导数等于0
- 对w求导就是把b当常数
- 对b求导就是把w当常数
1. 普通求导(只有一个变量)
函数:y=f(x)
写法 1(最常用)
\(\frac{dx}{dy}\)
读作:dy 比 dx
意思:y 对 x 求导
写法 2
f′(x)
读作:f 一撇 x
2. 偏导数(多个变量)
函数:z=f(x,y)
写法(唯一标准)
\(\frac{∂x}{∂z}\)
读作:偏 z 偏 x
符号:
- ∂ 读作:偏 / you du / 圆 d
- 专门用来表示**偏导数
梯度下降
调整w,b让损失函数变小
\(w=w-\eta (学习率) \frac{∂l(w,b)}{∂w}\)
\(b=b-\eta (学习率) \frac{∂l(w,b)}{∂b}\)
损失函数对所有参数的偏导数组成的向量叫梯度
变化w,b让损失函数变小最终求得w,b的过程 称 梯度下降
链式法则
输入层(x) -> 隐藏层(a) -> 输出层(y)
\(x^ \underrightarrow{g(w_1x+b_1)} a^ \underrightarrow{g(w_2a+b_2)} \hat y^ \underrightarrow{(y- \hat y)^2}l\)
\(\frac{∂l}{∂w_1} = \frac{∂L}{∂\hat y} \frac{∂\hat y}{∂a} \frac{∂a}{∂w_1}\)
这种偏导计算方式 称 链式法则(微积分中的复合函数求导)
反向传播
根据链式法则可以从右向左依次求导更新每一层的参数,参数一层层传播过去 称 反向传播
神经网络的训练
- 通过前向传播 根据输入x计算输出y
- 通过反向传播 计算出损失函数关于每个参数的梯度
- 每个参数向着梯度的反方向变化一点点
过拟合
训练数据表现很完美,没见过的数据表现很糟糕的现象 称 过拟合
从预测值与实际值的误差(损失值最小化)可能会把噪声和随机波动也学到
-
简化模型复杂度
-
增加数据的量
-
构建新函数
-
新损失函数 = 损失函数+\(\lambda \sum_{i=1}^N|w_i|\)(\(\lambda\) 正则化系数 \(\sum_{i=1}^N|w_i|\) 惩罚项)(L1正则化 绝对值之和叫L1范数)
-
新损失函数 = 损失函数+\(\sum_{i=1}^Nw_i^2\)(\(\lambda\) 正则化系数 \(\sum_{i=1}^Nw_i^2\) 惩罚项)(L2正则化 平方和的平方根叫L2范数)
正则化
通过向损失函数中添加权重惩罚项,抑制参数野蛮增长的方法叫正则化
超参数
控制参数的参数如:\(\lambda\) 正则化系数 称 超参数
-
-
Dropout
防止学习过程中过度依赖某些参数,在学习中随机丢弃一些参数 称 Dropout
泛化能力
没见过数据表现能力 称 泛化能力
数据增强
原本数据不够,可以旋转,翻转,裁剪,加噪声等等创造出更多新的数据样本
鲁棒性(Robostness)
让模型不因输入一点点小的变化,而对结果产生很大的波动,增强了模型的鲁棒性
模型遇到的问题
梯度消失
梯度反向传播时越来越小,导致参数更新困难
梯度爆炸
梯度数据越来越大,参数的调整幅度失去控制
收敛速度
收敛速度过慢陷入局部最优或者来回震荡
计算开销
数据规则模量太庞大,每次完整的前后传播,反向传播太耗时
解决办法
梯度裁剪
防止梯度的更新过大
残差网络
防止深层网络的梯度衰减
权重初始化&归一化
合理的权重初始化和输入数据归一化让梯度数据更平滑
动量法&RMSProp&Adam
用自适应优化器来加速收敛减少震荡
mini-batch
巨量数据分割成几个小批次来降低单次的计算开销
全连接层(FC)
每个神经元与前一层所有神经元相连 称 全连接层
卷积运算
用一个小窗口(卷积核 / Filter)在图片上滑动,每滑到一个位置,就做「对应位置相乘 → 全部相加」。
卷积核大小:1×1、3×3、5×5(常用 3×3)
步长 stride:每次滑几格
填充 padding:边缘补 0,防止图片越卷越小
卷积核
卷积核就是一个小矩阵,它在图片上滑动、做卷积运算,用来提取图片里的某种特征。
1×1
3×3(最常用)
5×5
卷积神经网络CNN
输入层(input) 卷积层(conv) 池化层(pool) 卷积层(conv) 池化层(pool) 全连接层(FC) 全连接层(FC) 输出层(output)
适用于图像识别领域的实际网络结构
编码
把文字变成输入参数,首先把文字变成计算机识别的数字,这个过程 称 编码
一个数字标识代码一个词 维度太低类似一维向量
one-hot(独热编码)
超级大向量,只用一个1来表示 维度太高且稀疏
词嵌入(word embedding)
把一个 “单词” 变成一个 “向量(一串数字)”,让计算机能看懂、能计算。
词嵌入的词向量,维度不高不低
点积
两个向量,对应位置相乘,再全部加起来。
点积做余弦相似度表示两个词语之间的相关性
\(a\cdot b = \sum_{i=1}^n a_ib_i\)
余弦相似度
只看方向,不看长短
点积做余弦相似度表示两个词语之间的相关性
\(cos(\theta) = \frac{a \cdot b}{|a|\cdot |b|}\)
嵌入矩阵
所有词向量组成一个大的矩阵就是 嵌入矩阵
潜空间
嵌入矩阵词向量维度很高,它所在的空间的维度也非常高 称 潜空间
循环神经网络RNN
理解词与词之间先后顺序的能力
公式:
\(h^{<t>} = g_1(W_{xh}X^{<t>}+W_{hh}h^{<t-1>}+b_h)\)
\(y^{<t>} = g_2(W_{hy}h^{<t>}+b_y)\)
过程:
-
输入词1\(X^{<1>}\)与权重矩阵\(W_{xh}\)相乘得到第一个词的隐藏状态\(h^{<1>}\)
-
\(h^{<1>}\) 与权重矩阵\(W_{hy}\)相乘得到第一个词的输出结果\(y^{<1>}\)
-
输入词2\(X^{<2>}\)时要与隐藏状态\(h^{<1>}\) 拼接起来
-
与权重矩阵(\(W_{xh}\) 再增加 \(W_{hh}\))相乘得到第二个词的隐藏状态\(h^{<2>}\)
-
\(h^{<2>}\) 与权重矩阵\(W_{hy}\)相乘得到第一个词的输出结果\(y^{<2>}\)
-
输入词3\(X^{<3>}\)时要与隐藏状态\(h^{<2>}\) 拼接起来
-
与权重矩阵(\(W_{xh}\) 再增加 \(W_{hh}\))相乘得到第三个词的隐藏状态\(h^{<3>}\)
-
\(h^{<3>}\) 与权重矩阵\(W_{hy}\)相乘得到第一个词的输出结果\(y^{<3>}\)

问题:
- 无法捕捉长期依赖
- 无法并行计算
解决办法:
抛弃顺序计算 使用Transformer
Attention注意力机制
所有 Attention 都只有这 3 个向量:
- Q (Query) 查询:我现在在找什么
- K (Key) 键:这里有什么内容
- V (Value) 值:真正要拿出来用的信息
- 每个词给一个位置编码,表现这个词在整个句子中的位置
- 用一个WQ矩阵(通过训练学习的一组权重值)与第一个词向量相乘,得到维度不变的Q1向量
- 用一个WK矩阵(通过训练学习的一组权重值)与第一个词向量相乘,得到维度不变的K1向量
- 用一个WV矩阵(通过训练学习的一组权重值)与第一个词向量相乘,得到维度不变的V1向量
- 实际GPU计算时是通过拼接而成的大矩阵做乘法
- 接下来用Q1跟K2(用一个WK矩阵与第二个词向量相乘,得到维度不变的K2向量),这表示在第一个词的视角里,第一个词和第二个词的相似度是多少
- 同理依次跟K3,K4分别做点积,还有跟自己的K1做点积
- 拿到相似度的系数后分别和V向量相乘再相加得到A1
- 此时的A1表示在第一个词的视角下按照和它相似度大小按权重把每个词的词向量都加到了一块,这就把所有上下文信息都包含在了第一个词当中
Multi-Head Attention 多头注意力
- 用两组WQ、WK、WV矩阵与这些词向量相乘等到两组 点积 这每组Q,K,V称作头
- 每组Q、K、V里再进行注意力层运算得到A向量,然后把两个A相向拼接起来
Transformer

编码器Encodeer
Transformer 图左
解码器Decoder
Transformer 图右
掩码Masked
掩码作用:让解码器在生成第 t 个词时,看不到 t 之后的未来词,保证生成顺序合法。
不分多头的单头注意力 & 多头注意力


公式:
\(Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})\)V
\(MultiHead(Q,K,V) = Concat(head_1,\cdots,head_h)W^O\)
\(where head_i = Attention(QW^Q_i,KV^K_i,VW^V_i)\)
浙公网安备 33010602011771号