神经网络小批量梯度下降算
时间: 2023-12-16 19:02:22 浏览: 65
一个简单的运用了梯度下降算法的神经网络例子.zip
神经网络小批量梯度下降算法是一种介于随机梯度下降和批量梯度下降之间的优化算法。相比于随机梯度下降,小批量梯度下降可以更好地利用矩阵运算的并行性,从而加速训练过程;相比于批量梯度下降,小批量梯度下降可以减少内存的占用,从而可以处理更大规模的数据集。
下面是神经网络小批量梯度下降算法的步骤:
1. 初始化神经网络的权重和偏置。
2. 将训练数据集分成若干个大小相同的小批量。
3. 对于每个小批量,依次执行以下操作:
a. 前向传播计算损失函数。
b. 反向传播计算梯度。
c. 根据梯度更新神经网络的权重和偏置。
4. 重复步骤3,直到达到指定的迭代次数或者损失函数达到指定的阈值。
下面是一个Python实现的例子:
```python
import numpy as np
# 定义神经网络的结构和参数
input_size = 2
hidden_size = 4
output_size = 1
learning_rate = 0.1
# 初始化权重和偏置
W1 = np.random.randn(input_size, hidden_size)
b1 = np.zeros((1, hidden_size))
W2 = np.random.randn(hidden_size, output_size)
b2 = np.zeros((1, output_size))
# 定义损失函数
def loss_function(X, y):
# 前向传播计算预测值
z1 = np.dot(X, W1) + b1
a1 = np.tanh(z1)
z2 = np.dot(a1, W2) + b2
y_pred = np.tanh(z2)
# 计算损失函数
loss = np.square(y_pred - y).sum()
return y_pred, loss
# 定义训练函数
def train(X, y, num_epochs, batch_size):
# 迭代训练
for epoch in range(num_epochs):
# 将数据集打乱顺序
indices = np.random.permutation(X.shape[0])
X = X[indices]
y = y[indices]
# 将数据集分成若干个小批量
for i in range(0, X.shape[0], batch_size):
X_batch = X[i:i+batch_size]
y_batch = y[i:i+batch_size]
# 前向传播计算损失函数
y_pred, loss = loss_function(X_batch, y_batch)
# 反向传播计算梯度
delta2 = (y_pred - y_batch) * (1 - np.square(y_pred))
dW2 = np.dot(a1.T, delta2)
db2 = delta2.sum(axis=0, keepdims=True)
delta1 = np.dot(delta2, W2.T) * (1 - np.square(a1))
dW1 = np.dot(X_batch.T, delta1)
db1 = delta1.sum(axis=0)
# 根据梯度更新权重和偏置
W2 -= learning_rate * dW2
b2 -= learning_rate * db2
W1 -= learning_rate * dW1
b1 -= learning_rate * db1
# 每迭代100次输出一次损失函数
if epoch % 100 == 0:
print("Epoch %d, loss = %f" % (epoch, loss))
# 生成训练数据集
X = np.random.randn(1000, input_size)
y = np.sin(X[:, 0] + X[:, 1]).reshape(-1, 1)
# 训练神经网络
train(X, y, num_epochs=1000, batch_size=32)
```
阅读全文