Transformer 前置知识 06:神经网络,线性层与激活函数

数学基础讲完了,这一课开始搭模型。

神经网络听起来很神秘,其实只有两种零件:线性层和激活函数,反复叠起来就是神经网络。


一个神经元:加权求和 + 偏置

先看最小的单位:一个神经元。它做的事很简单:

把每个输入乘以一个权重,加起来,再加上一个偏置。

比如判断要不要带伞:

一个神经元:输入乘以权重,加起来,再加上偏置
  • 下雨概率 0.8,乘以权重 2
  • 天色暗的程度 0.5,乘以权重 0.4
  • 最后加上偏置 −1

这些权重和偏置,就是模型要学习的参数。

一层 = 一次矩阵乘法

把很多个神经元并排放在一起,就是一层。

每个神经元都在算一次点积(第 1 课),所以整层就是一次矩阵乘法(第 2 课):

  • :输入向量
  • :权重矩阵,每一行是一个神经元的权重
  • :偏置向量
  • :输出向量,每个元素是一个神经元的结果

这就是线性层,也叫全连接层。

1
2
3
4
5
6
7
import numpy as np

x = np.array([0.8, 0.5]) # 输入:下雨概率、天色暗
W = np.array([[2.0, 0.4], # 神经元 1:要不要带伞
[-1.0, 0.3]]) # 神经元 2:要不要晒被子
b = np.array([-1.0, 0.5])
print(W @ x + b) # [ 0.8 -0.15]

只用线性层,有个大问题

两个线性层叠在一起,先乘 再乘 :

等于乘以一个新的矩阵 。叠再多层,也只相当于一层,白叠了。

而且线性层只能画直线(高维里是平面),可真实世界里,很多关系是弯的。

激活函数:给它掰个弯

解决办法是:在每一层后面,加一个激活函数。

最常用的是 ReLU:

小于 0 的变成 0,大于 0 的保持不变。就这么简单地一折:

  1. 叠起来的层不能再合并成一层
  2. 很多个”折线”拼在一起,网络就能拼出各种复杂的曲线

考考你:ReLU 的输入是 −3、0、2,输出分别是多少?

答案是 0、0、2。负数变成 0,其余的原样输出。

Transformer 里:GELU 与前馈网络

Transformer 里常用的是 GELU,它像一个平滑版的 ReLU,在 0 附近是圆滑过渡的:

ReLU 在 0 处直接折断,GELU 是平滑过渡

每个 Transformer 层里都有一个前馈网络(Feed-Forward Network):

线性层 → GELU → 线性层

这个前馈网络,占了模型参数的很大一部分。

全部连起来

整个神经网络,就是线性层和激活函数一层一层叠起来。训练过程把前几课全部串在了一起:

步骤 用到的知识
前向计算:线性层 + 激活函数,算出输出 第 1、2、6 课
算误差:用交叉熵衡量猜得准不准 第 4、5 课
反向传播:倒着乘,求出每个参数的梯度 第 3B 课
梯度下降:沿梯度的反方向更新参数 第 3 课

小结

  1. 神经元 = 加权求和 + 偏置
  2. 线性层 = 很多神经元并排 = 一次矩阵乘法
  3. 只有线性层,叠多少层都等于一层,所以要加激活函数
  4. ReLU 把负数变成 0;Transformer 里常用更平滑的 GELU
  5. Transformer 的前馈网络:线性层 → GELU → 线性层

下一课讲分词与词嵌入:文字是怎么变成向量的。