神经网络及其训练royhoo

一个神经元就是一个计算单元,传入$n$个输入,产生一个输出,再应用于激活函数。记$n$维输入向量为$x$,$n$维权重矩阵向量是$w$,偏置项为$b$,激活函数为sigmoid,最终激活后的输出为$a$:

\begin{align*}a=\frac{1}{1+\exp(-(w^Tx+b))}\end{align*}

将权重和偏置项组合在一起,得到如下公式:

\begin{align*}a=\frac{1}{1+\exp(-[w^T\quadb]\cdot[x\quad1])}\end{align*}

图1更直观地描述了该公式:

图1单个神经元的输入及输出

将单个神经元扩展到一层,共$m$个神经元,每个神经元的输入都是$x$,权重记做$\{w^{(i)},\cdots,w^{(m)}\}$,偏置项记做$\{b^{(i)},\cdots,b^{(m)}\}$,则每个神经元激活后的输出:

\begin{align*}a_1&=\frac{1}{1+\exp(-((w^{(1)})^Tx+b_1))}\\&\vdots\\a_m&=\frac{1}{1+\exp(-((w^{(m)})^Tx+b_m))}\end{align*}

下面我们定义更抽象的形式,以便用于复杂的神经网络:

\begin{align*}&W=\begin{bmatrix}-&w^{(1)T}&-\\&\cdots&\\-&w^{(m)T}&-\end{bmatrix}\in\mathbb{R}^{m\timesn}\\&b=\begin{bmatrix}b_1\\\vdots\\b_m\end{bmatrix}\in\mathbb{R}^m\\&z=Wx+b\\&\sigma(z)=\begin{bmatrix}\frac{1}{1+\exp(-z_1)}\\\vdots\\\frac{1}{1+\exp(-z_m)}\end{bmatrix}\\&\begin{bmatrix}a^{(1)}\\\vdots\\a^{(m)}\end{bmatrix}=\sigma(z)=\sigma(Wx+b)\end{align*}

图2简单的前馈神经网络

如图2所示的神经网络,只有1个隐层,输出:

\begin{align*}s=U^Ta=U^Tf(Wx+b)\end{align*}

其中,$f$是激活函数。

维度分析:假设词向量维度为2,一次使用5个词作为输入,则输入$x\in\mathbb{R}^{20}$。如果隐层有8个sigmoid神经元,并在输出层产生1个未规范化的分值,那么$W\in\mathbb{R}^{8\times20},b\in\mathbb{R}^{8},U\in\mathbb{R}^{8\times1},s\in\mathbb{R}$。

\begin{align*}J=\max(s_c-s,0)\end{align*}

训练神经网络的目标是使得$J$最小。

为了得到一个更安全的边界,我们希望正样本分值比负样本分值大出$\Delta$(大于0),因此:

\begin{align*}J=\max(s_c-s+\Delta,0)\end{align*}

\begin{align*}J=\max(s_c-s+1,0)\end{align*}

我们需要求得损失函数关于每个参数的偏导数,然后使用梯度下降更新参数:

\begin{align*}\theta^{(t+1)}=\theta^{(t)}-\alpha\nabla_{\theta^{(t)}}J\end{align*}

反向传播使用链式求导法则,求得损失函数关于每个参数的偏导数。为了进一步理解这一技术,首先看一下图3的神经网络:

图3

上图的神经网络只有一个隐层,一个输出。为简单起见,定义以下概率:

如图4,如果要更新$W^{(1)}_{14}$,首先要意识到,只有在计算$z^{(2)}_1$时才会用到$W^{(1)}_{14}$。$z^{(2)}_1$仅仅用于计算了$a^{(2)}_1$,$a^{(2)}_1$与$W^{(2)}_1$用于计算最终的分值。首先有算是函数关于$s$和$s_c$的偏导数:

\begin{align*}\frac{\partialJ}{\partials}=-\frac{\partialJ}{\partials_c}=-1\end{align*}

为简单起见,我们只计算$\frac{\partials}{\partialw^{(1)}_{ij}}$:

\begin{align*}\frac{\partials}{\partialw^{(1)}_{ij}}&=\frac{\partialW^{(2)}a^{(2)}}{\partialw^{(1)}_{ij}}\tag{1}\\&=\frac{\partialW^{(2)}_ia^{(2)}_i}{\partialw^{(1)}_{ij}}\tag{2}\\&=W^{(2)}_i\frac{\partiala^{(2)}_i}{\partialw^{(1)}_{ij}}\tag{3}\\\end{align*}

第(1)步很直观,因为$s=W^{(2)}a^{(2)}$。第(2)步是因为,只有在计算标量$a^{(2)}_i$时,才会用到向量$W^{(1)}_i$。第(3)步也很直观,我们是在求关于$W^{(1)}_i$的偏导数,$W^{(2)}_i$直接看做常数。

然后应用链式法则:

\begin{align*}W^{(2)}_i\frac{\partiala^{(2)}_i}{\partialw^{(1)}_{ij}}&=W^{(2)}_i\frac{\partiala^{(2)}_i}{\partialz^{(2)}_i}\frac{\partialz^{(2)}_i}{\partialw^{(1)}_{ij}}\\&=W^{(2)}_i\frac{\partialf(z^{(2)}_i)}{\partialz^{(2)}_i}\frac{\partialz^{(2)}_i}{\partialw^{(1)}_{ij}}\\&=W^{(2)}_if'(z^{(2)}_i)\frac{\partialz^{(2)}_i}{\partialw^{(1)}_{ij}}\\&=W^{(2)}_if'(z^{(2)}_i)\frac{\partial}{\partialw^{(1)}_{ij}}(b^{(1)}_i+a^{(1)}_1W^{(1)}_{i1}+a^{(1)}_2W^{(1)}_{i2}+a^{(1)}_3W^{(1)}_{i3}+a^{(1)}_4W^{(1)}_{i4})\\&=W^{(2)}_if'(z^{(2)}_i)a^{(1)}_j\\&=\delta^{(2)}_i\cdota^{(1)}_j\end{align*}

$\delta^{(2)}_i$本质上是第2层第$i$个神经元反向传回的误差。

现在我们换一种方式,用误差分配和反向传播来讨论如何更新图4中的更新$W^{(1)}_{14}$:

以上我们用链式法则和误差分配反向传播得到的结果是一样的。

偏置项更新:偏置项也可以看成输入向量的一个维度,只不过这个维度始终为1(这种1.1小节中的第二个公式就可以看出)。因此,第$k$层第$i$个神经元偏置项的偏导数直接就是$\delta^{(k)}_i$。例如,在上面我们是要更新$b^{(1)}_1$,而不是$W^{(1)}_{14}$,那么梯度直接就是$f'(z^{(2)}_1)W^{(2)}_{1}$。

将$\delta^{(k)}$到$\delta^{(k-1)}$的误差计算一般化:

图5从$\delta^{(k)}$到$\delta^{(k-1)}$的误差传播

用向量化的代码取代for循环,有助于提高代码的执行效率(可以充分利用GPU加速吧?)。

上面我们给出了如何计算一个参数的梯度,现在我们介绍更一般化的方法,一次性地更新整个权重矩阵和偏置向量。这一简单的扩张有助于为我们建立一种直觉,误差传播可以抽象到矩阵-向量级别。

给出一个权重$W^{(k)}_{ij}$,我们定义其误差梯度为$\delta^{(k+1)}_i\cdota^{(k)}_j$。$W^{(k)}$是将$a^{(k)}$映射为$z^{(k+1)}$的权重矩阵。我们可以建立整个矩阵$W^{(k)}$的误差梯度:

\begin{align*}\nabla_{W^{(k)}}=\begin{bmatrix}\delta^{(k+1)}_1a^{(k)}_1&\delta^{(k+1)}_1a^{(k)}_2&\cdots\\\delta^{(k+1)}_2a^{(k)}_1&\delta^{(k+1)}_2a^{(k)}_2&\cdots\\\vdots&\vdots&\ddots\end{bmatrix}=\delta^{(k+1)}a^{(k)T}\end{align*}

下面我们来看如何计算误差向量$\delta^{(k)}$。在图5中我们已经知道,$\delta^{(k)}_j=f'(z^{(k)}_j)\sum_i\delta^{(k+1)}_iW^{(k)}_{ij}$,这可以一般化为如下的矩阵形式:

\begin{align*}\delta^{(k)}=f'(z^{(k)})\circ(W^{(k)T}\delta^{(k+1)}_i)\end{align*}

其中,$\circ$运算符是指矩阵点乘($\mathbb{R}^N\circ\mathbb{R}^N\rightarrow\mathbb{R}^N$)。

计算效率:我们探索了基于元素的更新和基于矩阵的更新。我们必须意识到,向量化的实现在科学运算环境里效率更高,比如MATLAB和Python的NumPy/SciPy包。因此,我们应该使用向量化的实现。更进一步,在反向传播时应该避免重复计算。比如,$\delta^{(k)}$直接依赖于$\delta^{(k+1)}$。我们应该确保,在使用$\delta^{(k+1)}$更新完$W^{(k)}$之后,不能丢弃,而是要保存训练,用于后面计算$\delta^{(k)}$。重复这一过程$(k-1)\cdots(1)$。最终得到了一个计算上还负担得起的递归过程。

THE END
1.机器学习数据集合集!AiWaf-2 是一个高级的机器学习系统,使用多种模型来检测三种类别的网络行为:XSS攻击、SQL注入攻击和良性请求。该系统旨在提供高精度的威胁识别和分类,包括: GRU (门控循环单元) CNN (卷积神经网络) KNN (K-最近邻) SVM (支持向量机) RF (随机森林) https://blog.csdn.net/Kyzy_1919/article/details/144371975
2.机器学习Hinton 因通过神经网络对现代机器学习作出的奠基性贡献,获得 2024 年诺贝尔物理学奖。“将超越人的智力水平”:机器学习先驱获2024年诺贝尔物理学奖 机器学习2024-10-09 10:15 1896 划重点 012024年诺贝尔物理学奖授予美国普林斯顿大学的John Hopfield和加拿大多伦多大学的Geoffrey Hinton,以表彰他们开发了理解神经https://ailab.cn/ml/
3.训练简单的密集神经网络在本单元中,我们将了解如何训练最简单的密集神经网络(或感知器)识别手写数字,并尝试可视化网络权重以了解其工作原理。https://docs.microsoft.com/zh-cn/training/modules/intro-computer-vision-pytorch/3-train-dense-neural-networks
4.量子神经网络初体验从上述打印可以看到,此时构建的哈密顿量为对第0位量子比特执行泡利Z算符测量,且系数为-1。之所以将系数设为-1,是因为在量子神经网络的训练中,Ansatz中的参数的梯度会一直下降,同时测量值也会一直减少。如果最后收敛于-1,那么此时对应的量子态是|1?而不是|0,如下所示 https://www.mindspore.cn/mindquantum/docs/zh-CN/r0.5/initial_experience_of_quantum_neural_network.html
5.PaddlePaddle/PaddleClas:Atreasurechestforvisual基于ImageNet1k 分类数据集,PaddleClas 支持 37 个系列分类网络结构以及对应的 217 个图像分类预训练模型,训练技巧、每个系列网络结构的简单介绍和性能评估将在相应章节展现,下面所有的速度指标评估环境如下: Arm CPU 的评估环境基于骁龙 855(SD855)。 Intel CPU 的评估环境基于 Intel(R) Xeon(R) Gold 6148。 GPUhttps://openi.pcl.ac.cn/PaddlePaddle/PaddleClas/src/branch/develop/docs/zh_CN/models/ImageNet1k
6.获全美的壁纸和神经网络训练素材的网站集合获取精美的壁纸和神经网络训练素材的网站集合 天天对着电脑,也是经常要换一下屏幕的底色,让人耳目一新的感觉。本想随便在百度上找几个图片,没想到现在的图片都限制大小了,并且很多都收费了。免费的东西用惯了,只能花点时间自己去找点这样的网站,在一段时间的搜索尝试中,终于找到了几个比较ok的。这里推荐几个网站https://blog.51cto.com/u_15054047/4134143
7.python使用Tensorflow训练BP神经网络实现鸢尾花分类python所以只要给出足够多的鸢尾花花萼、花瓣数据,以及对应种类,使用合适的神经网络训练,就可以实现鸢尾花分类。 搭建神经网络 输入数据是花萼长、花萼宽、花瓣长、花瓣宽,是n行四列的矩阵。 而输出的是每个种类的概率,是n行三列的矩阵。 我们采用BP神经网络,设X为输入数据,Y为输出数据,W为权重,B偏置。有 https://www.jb51.net/article/212039.htm
8.愉快使用谷歌免费人工智能平台colab,训练你的神经网络模型,为你的言归正传,本人研究方向为音频信息隐藏,是不是很憨的方向,具体的暂时做使用神经网络做音频隐写分析。既然使用神经网络了,那肯定需要GPU资源了。总的来说就是需要一台cpu和gpu都很强劲,内存很大的工作站了。但是苦于实验室和导师现状,我一时半会搞不到GPU资源。但是天无绝人之路,谷歌提供了这个免费的平台。国内https://www.shanyemangfu.com/colab.html
9.神经网络的训练方法专利名称::神经网络的训练方法技术领域::本发明一般地涉及人工神经网络及其操作,尤其但不专门涉及一种改进的神经网络训练方法和/或系统,该方法和/或系统使得神经元能够在训练过程屮根据需要增加到网络中。背景技术::随着过去十年间产生的数据集的扩增和规模,人们更感兴趣于开发能够用于找到数据集内的一些关系、也就是https://www.xjishu.com/zhuanli/55/200680042779.html
10.最新训练神经网络的五大算法腾讯云开发者社区神经网络模型的每一类学习过程通常被归纳为一种训练算法。训练的算法有很多,它们的特点和性能各不相同。 问题的抽象 人们把神经网络的学习过程转化为求损失函数f的最小值问题。一般来说,损失函数包括误差项和正则项两部分。误差项衡量神经网络模型在训练数据集上的拟合程度,而正则项则是控制模型的复杂程度,防止出现过https://cloud.tencent.com/developer/article/1090593
11.不敲代码,也能训练深度神经网络?试试DeepCognition不敲代码,也能训练深度神经网络?试试DeepCognition 提起AI与编程,很多人的脑海里,浮现出的画面,也许是这样子的。 目前,即便是代码量要求较小的自动化 AI 模型训练框架,比如 AutoML/AutoKeras等,使用它们,也需要一定的的编程基础,需要编写许多行的代码。https://www.jianshu.com/p/4454893ad7eb
12.MIT史上首次用AI控制动物大脑活动!技术前沿洞察新闻频道找到神经网络的“子网络”,让神经网络训练更快更好 如今,我们生活中几乎所有基于人工智能的产品都依赖于有自主学习并标记数据能力的“深度神经网络”。 然而,为了更好地学习,神经网络通常需要需要大量的数据集进行大型的训练——这一训练过程耗时长、需要配备昂贵的GPU,有时还需要定制设计的硬件。这些客观因素导致深度https://news.hexun.com/2019-05-14/197178826.html
13.字节跳动破局联邦学习:开源Fedlearner框架,广告投放增效209%联邦学习技术本质上是为了帮助联邦双方更好地训练模型。不同公司由于此前积累的数据类型特征不同,落地应用场景不同,会采用不同的模型训练方式。 常见的模型训练包括神经网络模型训练、树模型训练、线性回归模型训练等等。其中,神经网络训练模型最常见的落地应用场景是推荐,包括个性化内容推荐、广告推荐等等,而树模型更多在https://maimai.cn/article/detail?fid=1550604028&efid=zqj9rqK7Yf_Us-lu-0Wnmg
14.清华大学交叉信息研究院然而,研究人员发现深度学习网络常常倾向于寻找“捷径”的解决方案,当数据分布与训练集有稍许偏差时,这样的捷径解常常会出现灾难性的错误。该研究发现,当人们可以根据输入信号中的关键成分提供一个额外的“引导”特征时,深度神经网络可以成功避免捷径,这个“引导”特征可以是一个对于输出目标的粗略估计。这样的“引导”是https://iiis.tsinghua.edu.cn/show-9635-1.html
15.基于一维宽核卷积神经网络—长短时记忆网络的单导脑电信号睡眠本文从数据类不均衡处理及神经网络模型训练优化两方面开展研究工作[18-19],构建高性能的睡眠状态识别模型,以达到准确分类睡眠状态的目的。首先,针对N1样本量与其他状态样本量不均衡的问题,采用合成少数过采样技术(synthetic minority over sampling technique,SMOTE)联合托梅克联系对(Tomek link,Tomek)算法(SMOTE-Tomek)对https://www.cjebm.com/article/10.7507/1001-5515.202204021