神经网络的数学基础
神经网络就是由一系列的张量运算组成
张量点积:
import numpy as np
z=np.dot(x,y)
- 两个向量x,y的点积
def naive_vector_dot(x,y):
assert len(x.shape)==1
assert len(y.shape)==1
assert 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 np
def naive_matrix_vector_dot(x,y):
assert len(x.shape)==2
assert len(y.shape)==1
assert 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)==2
assert len(y.shape)==2
assert 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):
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端