神经网络数学基础

一、张量数据结构

  一般来说,当前所有机器学习系统都使用张量作为基本数据结构。它是一个数据容器,所包含的数据大多都是数值数据。

  标量(0D张量):在Numpy中,一个float32或float64的数字就是一个标量。

  向量(1D张量):数字组成的数组叫作向量(vector)或一维张量。

  矩阵(2D张量):向量组成的数组叫作矩阵(matrix)或二维张量。

  将多个矩阵组合成一个新的数组,可以得到一个3D张量。即数字组成的立方体。例如,彩色图像有rgb三个通道,可以表示为3维张量。视频还有时间维,可以表示为4维张量。可以简单地总结为:有几层中括号,就是多少维的张量。

  张量的数据类型和numpy.array基本一一对应,但是不支持str类型。

  包括:torch.float64(torch.double) , torch.float32(torch.float) , torch.float16 , torch.int64(torch.long)...

# 自动推断数据类型
i = torch.tensor(1)
# 指定数据类型
x = torch.tensor(2.0,dtype = torch.double)
# 使用特定类型构造函数
b = torch.BoolTensor(np.array([1,0,2,0]))
# 不同类型进行转换
z = i.type_as(x)

Tensor和Numpy的相互转换:

#torch.from_numpy函数从numpy数组得到Tensor
arr = np.zeros(3)
tensor = torch.from_numpy(arr)

# numpy方法从Tensor得到numpy数组
tensor = torch.zeros(3)
arr = tensor.numpy()

# item方法和tolist方法可以将张量转换成Python数值和数值列表
scalar = torch.tensor(1.0)
s = scalar.item()

# numpy方法从Tensor得到numpy数组
tensor = torch.zeros(3)
arr = tensor.numpy()
#使用带下划线的方法表示计算结果会返回给调用张量
tensor.add_(1) #给 tensor增加1,arr也随之改变 

# 可以用clone() 方法拷贝张量,中断这种关联
tensor = torch.zeros(3)
#使用clone方法拷贝张量, 拷贝后的张量和原始张量内存独立
arr = tensor.clone().numpy() # 也可以使用tensor.data.numpy()

二、梯度下降

  output = relu(dot(W, input) + b),在这个表达式中,W 和 b 都是张量,均为该层的属性。它们被称为该层的权重(weight)可训练参数(trainable parameter),分别对应 kernel 和 bias 属性。这些权重包含网络从观察 训练数据中学到的信息。一开始,这些权重矩阵取较小的随机值,这一步叫作随机初始化(random initialization)。当然,W 和 b 都是随机的,relu(dot(W, input) + b) 肯定不会得到任何有用的表示。虽然得到的表示是没有意义的,但这是一个起点。下一步则是根据反馈信号逐渐调节这些权重。这个逐渐调节的过程叫作训练,也就是机器学习中的学习。  

  给定一个可微函数,理论上可以用解析法找到它的最小值:函数的最小值是导数为 0 的点, 因此你只需找到所有导数为 0 的点,然后计算函数在其中哪个点具有最小值。将这一方法应用于神经网络,就是用解析法求出最小损失函数对应的所有权重值。可以通 过对方程 gradient(f)(W) = 0 求解 W 来实现这一方法。这是包含 N 个变量的多项式方程, 其中 N 是网络中系数的个数。N=2 或 N=3 时可以对这样的方程求解,但对于实际的神经网络是 无法求解的,因为参数的个数不会少于几千个,而且经常有上千万个。

 

三、链式求导:反向传播算法

    将链式法则应用于神经网络梯度值的计算,得到的算法叫作反向传播(backpropagation)。反向传播法是梯度下降法在深度网络上的具体实现方式。

  反向传播就是从最后一层开始,一层一层往前计算每一层神经元的残差值。根据残差值计算损失函数对权值的导数,然后更新权值。计算所有节点上的残差之后,就可以根据公式得到损失函数对所有W 和 b 的偏导数。这个才是反向传播计算所有节点上的残差的真正目的。

四、激活函数

  在讲反向传播的时候我们已经说过,误差需要从输出层一层一层的传递到输入层的,然而在传递过程中你会发现梯度越来越小,甚至都没有梯度了(这种现象称为梯度弥散问题 vanishing gradients problem);而又存在再一些相反的案例,比如循环神经网络中,梯度会越来越大,这样权重始终在更新,因而训练一直得不到收敛,这种现象称为梯度爆炸问题(exploding gradients problem)。

 

未完...

posted @ 2022-03-02 21:13  hungry_J  阅读(15)  评论(0)    收藏  举报