神经网络就是由一系列的张量运算组成
张量点积:
import numpy as np
z=np.dot(x,y)
- 两个向量x,y的点积
def naive_vector_dot(x,y):assert len(x.shape)==1assert len(y.shape)==1assert x.shape[0]==y.shape[0] #x的第0维和y的第0维要相同z=0. #浮点数for i in range(x.shape[0]):z+=x[i]*y[i]return z
- 一个矩阵x和一个向量y的点积
import numpy as npdef naive_matrix_vector_dot(x,y):assert len(x.shape)==2assert len(y.shape)==1assert x.shape[1]==y.shape[0]z=np.zero(x.shape[0])for i in range(x.shape[0]):for j in range(x.shape[1]):z[i]+=x[i,j]*y[j]return z
同样也可以复用前面的代码:
def naive_matrix_vector_dot(x,y):z=np.zeros(x.shape[0])for i in range(x.shape[0]):z[i]=naive_vector_dot(x[i, :],y)return z
- 两个矩阵之间的点积
def naive_matrix_dot(x,y):assert len(x.shape)==2assert len(y.shape)==2assert x.shape[1]==y.shape[0] #x的1维和y的0维z=np.zeros((x.shape[0],y.shape[1]))for i in range(x.shape[0]):for j in range(y.shape[1]):row_x=x[i, :]column_y=y[:, j]z[i,j]=naive_vector_dot(row_x,column_y)return z
张量点积同样可以适用于更高维的张量!!!
但是形状得遵循与前面2D张量相同的原则:
(a,b,c,d) . (d,) -> (a,b,c)
(a,b,c,d) . (d,e) ->(a,b,c,e)
以此类推!!
张量变形
变形后的张量元素总个数与初始张量相同。一种特殊的张量变形是转置。
张量运算的导数——梯度(多元函数导数,输入可能有多个权重)
- 例如输入的是一个矩阵W(同时还有输入的向量x)以此计算预测值y_pred,计算损失(或者说预测值y_pred和目标y之间的距离)
保持x和y不变,那么就可以看作预测值y_pred和目标y之间的距离
loss_value=f(W)
- 若当前W的值为w0,f在W0点的导数是一个张量
gradient(f)(W0)
,其形状与W相同 - 训练循环trianing loop:
- 抽取训练样本x和对应目标的y组成的数据批量
- 在x上运行网络【这一步叫前向传播(forward pass)】,得到预测值y_pred。
- 计算网络在这批数据上的损失,用于衡量y_pred和y之间的距离。
- 更新网络的所有权重,使网络在这批数据上的损失略微下降
- 可以采用随机梯度下降(小批量随机梯度下降SGD):
计算损失相对于网络参数的梯度【一次反向传播(backward pass)】
将参数沿着梯度的反方向移动一点,比如W -= step*gradient,从而使这批数据的损失减小一点
- 可以采用随机梯度下降(小批量随机梯度下降SGD):