Loading [MathJax]/jax/element/mml/optable/BasicLatin.js

NN 神经网络



线性函数

也可以称为 得分函数

假设十分类
W 为权重参数,里面每一个数值代表这个点的重要性;正值是促进作用,负数代表抑制作用;控制着决策边界。这里有10 行数据;
b 为偏置,微调;


损失函数

LI=jyimax(0,sjsyi+1)
神经网络既可以做分类,也可以做回归;
回归任务由得分计算损失,分类任务由概率计算损失。


对于分类问题:

sj 其他类别
syi 正确类别
错误类别分数 - 正确类别分数 + 1
δ ,代表容忍程度。 在这个式子中,正确类别比错误类别至少高 1 才能看做没有损失; 也可以使用3,5。


计算示例


样本个数

损失函数和样本个数没有关系,在多样本情况下,损失函数表达式为:


损失函数的改进

问题:如果损失函数的值相同,是否意味着两个模型一样?

如下例所示:
$ f(x, W)=W x L=\frac{1}{N} \sum_{i=1}^{N} \sum_{j \neq y_{i}} \max(0, f(x_{i} ; W){j}-f(x ; W)_{y_i}+1) $

输入数据: $ x=[1, 1,1,1] A w_1 = [1, 0, 0, 0] B w_2 = [0.25, 0.25, 0.25, 0.25] $

数据损失:wT1x=wT2x=1


正则化惩罚项

两个不同的模型 w1 和 w2,得到的结果是一样的,这显然不对;
很明显,模型A只关注局部特征,绝对产生过拟合。
所以构建损失函数的时候,还需要增加 正则化惩罚项

损失函数 = 数据损失(dataloss) + 正则化惩罚项

L=1NNi=1jyimax

正则化惩罚项:R(W) = \sum_k \sum_l W^2_{k,l}

神经网络过于强大,容易过拟合。希望模型不要太复杂,过拟合的模型没用。


终极版本:


Softmax 分类器

s = f(x_i; W)
归一化:P(Y = k \mid X = x_i) = \frac{e^s k}{\sum_j e^s j}
计算损失值: L_i=- \log P(Y=y_i \mid X=x_i)


计算实例:

1、使用指数 e^3.2 \rightarrow 24.5

2、归一化 \frac{24.5}{24.5 + 164 + 0.18} \rightarrow 0.13

3、取对数函数负值 L_i = -log(0.13) = 0.89;正确答案是 cat,所以归一化后的值越接近于 1 越好,取对数越接近于0。


交叉熵损失函数

Cross Entropy Error Function


前向传播 & 反向传播

以上介绍的是前向传播,即知道 x 和 W,到计算完损失。


神经网络的目标是:更新、得到最合适的 W。

反向传播:使用梯度下降优化算法,

线性回归中虽然可以求得最终结果,但这个结果只能看做巧合。因为所有机器学习问题中,除了线性回归,其他问题是求解不出最终的真实答案。所以应该想优化思路,来让机器真正学习起来。

机器学习常规套路:给定数据和结果,让机器沿着 loss 减少的方向去做。


反向传播

示例

结果计算: f(x, y, z) = (x + y) z
期望得到最小的 f 值
want : \frac{\alpha f}{\alpha x} , \frac{\alpha f}{\alpha y} , \frac{\alpha f}{\alpha z}

假设 q = x + y

对 x 求偏导: \frac{\alpha f}{\alpha x} = \frac{\alpha f}{\alpha q} \frac{\alpha q}{\alpha x}
对 y 求偏导: \frac{\alpha f}{\alpha y} = \frac{\alpha f}{\alpha q} \frac{\alpha q}{\alpha y}


链式法则
梯度是一步步传播的

正向传播中 [(xw_1) w_2 ] w_3 = f
反向传播,要从后往前,逐层求这一层的影响(求导)

实际情况不是求数据的偏导,而是求 矩阵 的偏导。拿笔计算不现实。


不止可以一步步计算,也可以整体大块计算,作为 sigmoid gate。


门单元

  • 加法门单元:均等分配
  • MAX 门单元:给最大的
  • 乘法门单元:互换的感觉

其实跟生物学没有关系,只要知道数学模型、权重、矩阵参数的计算过程即可。

神经网络的根本工作,就是找权重参数:什么样的权重参数,最适合当前的任务。


整体架构

  • 层次结构
  • 神经元
  • 全连接
  • 非线性:每一步矩阵计算之后

隐藏层的数据,不一定有实际意义,只是对于计算机更容易分辨。


基本结构

f = W_2 max(0, W_1x)


继续堆叠一层

f = W_3 max(0, W_2 max(0, W_1x))

神经网络的强大之处在于,用更多的参数来你和复杂的数据。
通常情况是 千万到上亿的参数。


神经元越多,过拟合风险越大


激活函数

使用函数 Sigmoid,Relu,Yanh 等

最早神经网络就是使用 Sigmoid 来做,现在基本不用了。因为一旦数值较大或较小,得到的结果就不好了,会出现梯度消失现象。(函数图像两端趋向平稳,求导为0)

现阶段更多使用 Relu 函数或 Relu 函数的变体。


数据预处理

1、标准化

一般会做 标准化操作:中心化(减均值),放缩扩充(除标准差)


2、初始化

通常使用随机策略 来进行参数初始化;
不让网络中不同的权重参数值W浮动太大;

W = 0.01 * np.random.randn(D, H)


其他
文本去停用词,图像数据标准化等


解决过拟合问题

一般会加正则化 RW 让神经网络不要太强;
也可以使用Drop-out 来消减网络威力。
是传说中的 七伤拳:伤敌七分,自损三分。

左图为全连接网络;
在神经网络训练阶段,按照比例 随机杀死一部分神经元(这次迭代不使用,下次可能使用)。在测试阶段,没必要杀死,会拿整个神经网络来直接进行测试。


神经元个数对结果的影响

理论情况下,神经元越多,过拟合的风险越大。速度更慢。
一般 64,128 是常见的值。

可视化展示的神经网络:
https://cs.stanford.edu/people/karpathy/convnetjs/demo/classify2d.html


https://zhuanlan.zhihu.com/p/35709485

posted @   月思  阅读(456)  评论(0编辑  收藏  举报
编辑推荐:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示