神经网络基础 @ Wings            分类 技术
发布于 星期五, 三月 19 日, 2021 年
更新于 星期二, 七月 20 日, 2021 年

面了个极创, 学长们在搞移动端人工智障的项目. 然后我就得开始系统学人工智障了.

永凯学长给了资料, 本文是参考Victor Zhou的博客Machine Learning for Beginners: An Introduction to Neural Networks学习后的笔记.

之前听科创的学长讲过2h, 所以现在看起来好像挺简单?

1. 神经元

结构

神经网络的基本单位, 大致功能是 接受数据 $\to$ 处理数据 $\to$ 输出数据. 简单理解就是一个函数, 输入是一个向量$\vec x$, 输出是一个值.

两个输入的神经元

一个神经元中还有一个大小和输入相同的 权重向量$\vec w$ 和一个 偏置值$b$, 这些值是用来处理数据的.

功能

一个神经元的功能就是处理一下输入的数据然后输出, 写成函数的形式:

$$y = F_A(\vec x \cdot \vec w + b)$$

其中, $F_A(x)$ 是激活函数(Activation Function), 常用激活函数有 Sigmoid, tanh, ReLU 等.

由输入计算输出的过程成为 正反馈(Feedforward)

2. 神经网络

结构

将多个神经元连接起来, 构造成的网络就称为神经网络. 神经网络不是乱连的, 有如下结构:

输入层

输入层严格来说是数值而不是网络, 就是输入的向量$x$. 只有一层输入层.

隐藏层

隐藏层可以有多层, 每层的神经元数量可以不同, 可以比输入少, 也可以比输入多, 或者相等

输出层

输出层只有一层, 可以有多个输出.

网络结构

将相邻的层中构成的二分图连成完全二分图即可.

如图是一个2个输入, 一层2个神经元的隐藏层, 1个输出的神经网络:

2个输入, 一层2个神经元的隐藏层, 1个输出的神经网络

3. 训练网络

损失(Loss)

假如现在有一个神经网络, 并且确定了每个神经元的参数($\vec w, b$), 那么对于任何一个输入, $\vec x$, 都能得到一个输出 $\vec y$

如何评估这个网络是不是预测准确了呢? 很简单, 我们只要看看 真正 的值和输出的值是不是 差不多 就行.

所以我们要量化这个 差不多 的概念.

均方误差(Mean Squared Error, MSE) 来判断是不是差不多.

$$MSE = \frac{1}{n}\sum_{i=1}^n (y_{true} - y_{pred})^2$$

我们用 MSE 来表示 损失(Loss) 这个概念, 损失越小, 预测越准.

梯度下降

损失越小, 预测越准, 所以要使得我们的预测准确, 就是最小化损失

训练即最小化损失

最小化损失可以用 梯度下降(Stochastic Gradient Descent, SGD) 的方法做.

神经网络实际上可以看成一个对每个神经元的复合函数, 网络结构对应的就是复合的方法. 于是我们可以得到输出对输入的函数图像, 函数的极小值点全导数为0.

全导数为0, 每个偏导数也为0. 所以我们可以对每个变量单独考虑.

假设当前考虑的变量为$\alpha$, 损失为$L$, 那么我们可以做出$L — \alpha$图像, 这是一个二维图像. 现在问题就变成, 如何在二维函数上找极小值.

如何找极小值点呢? 求导算零点? 那就变成解一个极其奇怪的方程了, 不太可行. 但我们可以随便选取一个$\alpha_0$, 算出函数在这一点的导数值 —— 这是可行的, 只需要代入$\alpha_0$计算即可. 假设当前点是$\alpha$, 求导以后, 通过导数的正负可以知道图像在$\alpha$处的"走向", 也就是说知道在$\alpha$附近, $\alpha$稍稍往哪边改变一点点, 能够使得$L$减小. 所以, 改就完事了. (和牛顿迭代求零点是一个思路)

那么问题来了, 改变的步长是多少呢? 如果步长太小, 接近极小值点的速率就很慢; 如果步长太大, 可能一步就跨过了极小值点.

在牛顿迭代中是用切线和坐标轴相交的点, 这可以快速逼近零点. 但是这里我们要找的导数的零点是从下往上穿的, 而牛顿迭代找到的零点是随便一个, 所以优秀的牛顿迭代就无了

观察可得由高数知识, 极值点的导数为0, 它附近的点导数接近0. 所以我们不妨认为, $\frac{\partial L}{\partial \alpha}$ 和0越接近, $\alpha$ 便和极值点越接近. 在极小值点附近, 我们当然希望步长能够小一点, 慢慢逼近极小值点, 而不至于在极小值点附近反复横跳.

梯度下降就利用了这一点性质. 把步长设为 $\eta \frac{\partial L}{\partial \alpha}$, 其中, $\eta$ 是一个自己设置的常数, 称为 学习率(Learning Rate) 形式化来说, 就是每次 $\alpha$ 的值都这样改变:

$$\alpha \leftarrow \alpha - \eta \frac{\partial L}{\partial \alpha}$$

然后不停迭代, 直到 $L$ 变化不大为止, 认为找到了极小值.

通过当前损失来修改参数的过程成为负反馈(Feedback)

对每一个参数都这样做, 就是训练啦.

没了, 就这么简单.

留下昵称和邮箱, 可在第一时间获悉回复通知哦~

2021 FLAG

  • 找个妹子
  • 进计科
  • XCPC拿块金牌
  • 补全算法知识, 整全板子
  • 学会Web开发相关知识
  • 在服务器上搭建电子书库
  • 写个游戏并上线
  • 能弹一首曲子
  • 写首完整的曲子
  • 练习悠悠球
  • 三阶速拧20s

个人简介

我叫 Wings, 来自江西上饶, 目前人在西安, 是西电的一名学生.

常以 WingsWingsZengWingsWings的ID在各大小网站上游走, 一般来说, Wings不是我 😔, WingsZeng 一定是我 😊.

热爱算法, 喜欢钻研各种计算机技术.

业余爱好广泛, 只要不是文化课基本上都感兴趣😏.

开发/项目经历

  1. Android游戏 小墨滴的复仇 (弃坑)
  2. Android游戏 Circle Run (弃坑)
  3. Windows游戏 Snague (可能弃坑了吧)
  4. Python后端 Fathy' (可能弃坑了吧)

to be continued

教育经历

时间 学历 学校
2008-2014 小学 上饶市第十二小学
2014-2017 初中 上饶市第四中学
2017-2020 高中 上饶市第一中学
2020-2024 本科 西安电子科技大学
to be continued

比赛/竞赛经历

太久远太小的记不到了…

  1. 2017 国学竞赛初赛江西 没有分数或排名 二乙
  2. 2018 NOIP提高 258 省二
  3. 2019 CSP-S江西专场 145 省二
  4. 2019 数学竞赛初赛 70 没排名 (复赛打铁qaq)
  5. 2020 Gitee|Python贪吃蛇魔改大赛 可能是第四? 二等奖
  6. 2020 西电ACM训练基地熊猫杯 第四 银牌
  7. 2020 西安三校微软学生俱乐部Hackathon 和二等奖最后一名差0.5分 三等奖
  8. 2020 西电星火杯 三等奖
  9. 2020 西电ACM新生赛 第九 金牌
  10. 2020 ICPC 亚洲区域赛 济南站 132名 铜牌
  11. 2020-2021 第二届全国大学生算法设计与编程挑战赛(冬季赛) 924名 铜牌 (别骂了别骂了)
  12. 2020 ICPC 亚洲区域赛 昆明站 打星
  13. 2020 ICPC Asia-East Continent Final 签完到溜 打铁
  14. 西电"智能星"第一届自动驾驶小车比赛 第五 优胜奖|极速奖 本来可以冠军的别骂了别骂了

to be continued

爱好

技术

  • 算法
  • 独立游戏开发

游戏

  • Minecraft
  • Black Survival
  • I Wanna
  • Celeste
  • Life is Strange
  • Need for speed

运动

  • 篮球
  • 桌球
  • 乒乓球
  • 羽毛球
  • 慢跑

音乐

  • 吉他
  • 词曲
  • 流行

玩具

  • 魔方
    • 三阶速拧
    • 三阶盲拧
    • 高阶
  • yoyo球

追星

  • VAE
  • Benedict Cumberbatch