神经网络的数学基础

神经网络就是由一系列的张量运算组成

张量点积

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:
    1. 抽取训练样本x和对应目标的y组成的数据批量
    2. 在x上运行网络【这一步叫前向传播(forward pass)】,得到预测值y_pred。
    3. 计算网络在这批数据上的损失,用于衡量y_pred和y之间的距离。
    4. 更新网络的所有权重,使网络在这批数据上的损失略微下降
      • 可以采用随机梯度下降(小批量随机梯度下降SGD):
        计算损失相对于网络参数的梯度【一次反向传播(backward pass)】
        将参数沿着梯度的反方向移动一点,比如W -= step*gradient,从而使这批数据的损失减小一点
posted @   W-Vicky11  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示