凭着多年的编程经验,突然接触到了“深度学习”这块硬骨头,有点无从下手。因为,多年的编程几乎都是业务、逻辑的编程,很少遇到这样高度“数学化”的东东,可谓纯情小白一只。
好在,那些曾经奄奄一息、于悬崖边垂挂的线性代数、概率论、高数,多年以后再度重温,居然于字句中不忍怒骂:编书的老家伙们,干嘛如此惜墨如金!
好了,废话少说。深度学习,往往先从神经网络模型开始。
神经网络模型
一个三层神经网络.png对于这样一个神经网络,其学习的几个重要点是:
1、掌握它的专业名词和相关数学符号
2、进行数学表示,即利用线性代数对其进行矩阵表示和向量表示
3、程序化,即将数学表示转化为 python 程序
第1点本文不再普及,主要进行第2点,第3点程序化的问题也暂时不提。
网络的第一层
首先把目光锁定在 layer0 到 layer1 这一层运算,其整体是 3 个未知数 x1, x2, x3 经过 4 个方程的线性运算,最终得到 4 个结果值。于是有以下矩阵表示:
layer1 线性方程的矩阵表示.png单个节点方程
如果单看 layer1 的第一个节点(神经元),三个未知数和三个权重系数进行加权运算,得到一个加权值。这样得运算就是一个方程,表示为:
layer1 第一个节点的矩阵运算表示.png至于为什么要转置,我猜权重系数 w 和未知数 x 在网络中的视觉上都是“竖”向排列的,因此矩阵运算中“躺着”看起来描述得不准确,故将其转置一下~
整层节点方程
将上述 1 个节点纵向扩展为 4 个节点,便能写出整个 layer1 层所有节点的整体数学表示(并使用大写 W 表示 layer1 的权重系数矩阵):
layer1 整层矩阵运算表示.png整层节点的每一个节点,经过一个偏移量和一个激活函数处理后,就得到最终的结果。仍然用一个简练的整体的数学表示为:
激活函数处理.pngn 层神经网络
n 层神经网络的数学符号表示,只不过是上述推导的一层网络的重复迭代而已。此时能感受到单层网络的维度瞬间增加到 n 维,其数学推导如下:
n 层网络迭代.png多层神经网络便构成了一个多层感知机,它通过输入几个变量属性,便能响应出一个结果。
k 个样本
以上是将单层网络向多层网络的维度扩张,并且用的是一个样本的 3 个属性去进行计算的。试想,如果有百万千万个样本(如有 k 个样本),每个样本携带有 m 个属性,在数学表示上是不是又变得复杂起来?
好消息是问题并没有变复杂——每一个样本的运算都经历了相同的步骤,k 个样本就是 k 次相同运算,在编程时,这只是一个 for 循环的事儿。得益于神经网络模型严谨的设计,使得维度扩张显得如此轻而易举。
个人觉得,从矩阵变换的角度理解下 k 个样本的运算,大概是这样的:
如果没有激活函数或者激活函数是一个线性函数,那么整个神经网络就相当于一个超级变换矩阵 W s,将 k 个样本进行一次线性变换,就得到了对应的最终结果 y 帽。
但深度学习中,激活函数往往都是非线性的,目的之一就是破坏这种线性变换关系,那此时神经网络相当于一个超级函数 f s,将 k 个样本进行一次非线性变换,得到了对应的最终结果 y 帽。
而我们所有后面要做的事,就是找到某种形式下的最优的这种超级函数 f s。
本图符号表示为自个儿定义的,谨防误解.png编辑这些公式不容易,若转载请注名本作者。
网友评论