先把天气和食物写成向量:普通网络到底在算什么 · znzryb
# 先把天气和食物写成向量:普通网络到底在算什么
主要参考:[Luis Serrano:A friendly introduction to Recurrent Neural Networks](https://www.youtube.com/watch?v=UNmqTiOnRfg)。这组中文学习笔记结合视频与观看时的截图批注整理,保留 Intro RNN 文件夹中的全部 20 张原图。视频画面版权归原作者所有。
这组笔记从一个做饭的例子出发:先让网络根据天气选食物,再让它记住上一次做了什么,最后把“过去”和“现在”放进同一次计算。本篇使用第 01—06 张截图;后两篇继续使用第 07—20 张。
## 从一张完整的输入输出图开始

*截图 01|普通网络的任务:晴天做苹果派,雨天做汉堡*
图里的 NN 是 neural network,也就是神经网络。左边和右边是在展示同一个网络遇到不同输入时的行为:晴天得到苹果派,雨天得到汉堡。
这一步先不考虑昨天,也没有循环。我们只问:怎样把“天气对应食物”这件事变成计算机可以计算的东西?
## 先给天气和食物一个数字表示

*截图 02|用不同位置上的 1 表示不同食物与天气*
苹果派写成 $(1,0,0)^T$,汉堡是 $(0,1,0)^T$,鸡肉是 $(0,0,1)^T$。晴天是 $(1,0)^T$,雨天是 $(0,1)^T$。上标 $T$ 表示把这一排数字竖着写,作为列向量。
这叫 one-hot 编码:只有表示当前类别的位置是 1,其他位置是 0。它不是在说“汉堡比苹果派大”,只是用不同的位置区分类别。天气有两类,所以用两个位置;食物有三类,所以用三个位置。

*截图 03|把图标换成向量后,网络依旧是在做天气到食物的映射*
换成向量以后,任务没有变化:输入两个数,输出三个数。图标负责帮助我们理解含义,向量负责让这个含义进入计算。
## 矩阵乘法怎样选出食物

*截图 04|矩阵的第一列对应晴天,第二列对应雨天*
截图中的矩阵可以记为 $W$:
$$
W=\begin{bmatrix}1&0\\0&1\\0&0\end{bmatrix}.
$$
将它乘以晴天向量,就取出第一列;乘以雨天向量,就取出第二列。因此 $W(1,0)^T=(1,0,0)^T$,$W(0,1)^T=(0,1,0)^T$,恰好对应苹果派和汉堡。
这里有一个很好用的直觉:**矩阵乘 one-hot 向量,就是取出相应的一列。**不必每次都从头背一遍乘法口诀。

*截图 05|这一步是线性映射:固定矩阵把输入变成输出*
图上两条箭头分别画出两类输入的去向。这个具体例子的计算只有 $y=Wx$,属于线性映射。
线性有两个要求:输入相加,输出也相加;输入乘一个倍数,输出也乘同样的倍数。用公式记就是 $W(x+z)=Wx+Wz$ 和 $W(cx)=cWx$。后面遇到 non-linear 时,就可以用这个标准判断。
这里的矩阵是为了实现已知规则而手工设置的。一般训练神经网络时,权重由数据和训练过程调整;也常加入偏置与非线性激活。不要把这个极简例子当成所有神经网络的完整定义。
## 圆点和连线其实也在计算同一件事

*截图 06|矩阵元素对应连线权重,每个输出是输入的加权和*
左侧两个输入圆点分别装着天气向量的两个分量,右侧三个输出圆点装着食物向量的三个分量。每条边上的数字是权重。
例如第一个输出等于“第一个输入乘 1,加上第二个输入乘 0”,所以晴天时它等于 1。第二个输出则是“第一个输入乘 0,加上第二个输入乘 1”。矩阵写法和圆点连线写法描述的是同一组计算。
这一篇可以用一句具体的话自测:给定雨天向量,我能指出矩阵的哪一列被选中,也能沿着连线算出为什么得到汉堡。下一篇把问题改成:今天该做什么,还与上一次做过什么有关。