NN 神经网络
线性函数
也可以称为 得分函数
假设十分类
W 为权重参数,里面每一个数值代表这个点的重要性;正值是促进作用,负数代表抑制作用;控制着决策边界。这里有10 行数据;
b 为偏置,微调;
损失函数
LI=∑j≠yimax(0,sj−syi+1)
神经网络既可以做分类,也可以做回归;
回归任务由得分
计算损失,分类任务由概率
计算损失。
对于分类问题:
sj 其他类别
syi 正确类别
错误类别分数 - 正确类别分数 + 1
δ ,代表容忍程度。 在这个式子中,正确类别比错误类别至少高 1 才能看做没有损失; 也可以使用3,5。
![](https://img2020.cnblogs.com/blog/698385/202102/698385-20210208172341956-1898809167.png)
计算示例
![](https://img2020.cnblogs.com/blog/698385/202102/698385-20210202084754711-1575449993.png)
样本个数
损失函数和样本个数没有关系,在多样本情况下,损失函数表达式为:
![](https://img2020.cnblogs.com/blog/698385/202102/698385-20210208172750262-426658280.png)
损失函数的改进
问题:如果损失函数的值相同,是否意味着两个模型一样?
如下例所示:
$ 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=1N∑Ni=1∑j≠yimax
正则化惩罚项:R(W) = \sum_k \sum_l W^2_{k,l}
神经网络过于强大,容易过拟合。希望模型不要太复杂,过拟合的模型没用。
终极版本:
![](https://img2020.cnblogs.com/blog/698385/202102/698385-20210208173732192-1670319330.png)
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,到计算完损失。
![](https://img2020.cnblogs.com/blog/698385/202102/698385-20210202084809480-1350654256.png)
神经网络的目标是:更新、得到最合适的 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
- Mr.括号:神经网络15分钟入门!足够通俗易懂了吧
https://zhuanlan.zhihu.com/p/65472471
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!