我从一开始就试图从神经网络入手。这意味着从感知器开始玩弄。目前,我正在尝试实现批量梯度下降。我要遵循的指南提供了以下伪代码:
我尝试使用一些虚拟数据按以下方式实现,但发现它不是特别准确。它收敛,我认为是一些局部最小值。
我的问题是:
我有什么方法可以检查这是否是局部最小值,我一直在研究如何绘制此图形,但不确定如何实际执行此操作。除此之外,是否有办法使用梯度下降来获得更准确的结果?还是我必须使用更复杂的方法,或者可能从不同的随机权重开始多次运行它,以尝试找到全局最小值?
在发布此内容之前,我曾浏览过该论坛,但没有找到太多让我确信自己在这里正在做的事情或正在发生的事情实际上是正确的信息,因此任何帮助都会很大。
import pandas as pd
import numpy as np
import random
import math
def main():
learningRate = 0.1
np.random.seed(1)
trainingInput = np.asmatrix([
[1, -1],
[2, 1],
[1.5, 0.5],
[2, -1],
[1, 2]
])
biasAccount = np.ones((5,1))
trainingInput = np.append(biasAccount, trainingInput, axis=1)
trainingOutput = np.asmatrix([
[0],
[1],
[0],
[0],
[1]
])
weights = 1 * np.random.random((3,1))-1
for iteration in range(10000):
prediction = np.dot(trainingInput, weights)
print("Weights: \n" + str(weights))
print("Prediction: \n" + str(prediction))
error = trainingOutput - prediction
print("Error: \n" + str(error))
intermediateResult = np.dot(error.T, trainingInput)
delta = np.dot(learningRate, intermediateResult)
print("Delta: \n" + str(delta))
weights += delta.T
main()
答案 0 :(得分:0)
不能保证您会找到全局最小值。人们通常会进行多次跑步并获得最佳跑步。先进的方法包括使用自适应学习率(例如使用RMSProp或Adam)或使用具有动量的GD来降低学习率。
有多种方法可以监视收敛:
使用损失(提示:(t -Xw)X
是导数),检查较小的值或较小的变化。
Early stopping:检查(保留的)验证集中的错误是否减少了,如果没有减少,请停止训练。
(可能的是,您甚至可以连续地检查砝码之间的距离,以查看是否有任何变化。)