0

我想在 python 或 C++ 中为以下输入实现反向传播算法

[[11, 15], [22, 17]]
[[8, 11], [23, 19]]
[[9, 14], [25, 22]]
[[6, 9], [17, 13]]
[[2, 6], [29, 25]]
[[4, 8], [24, 20]]
[[11, 15], [27, 24]]
[[8, 11], [31, 26]]
[[3, 8], [25, 21]]
[[11, 15], [26, 22]]
[[15, 19], [22, 17]]
[[7, 11], [17, 13]]
[[19, 24], [14, 10]]

其中第一个元组是我的输入,第二个元组是我的输出。我在互联网上搜索的每个反向传播算法的实现都使用了一个分类程序(1 或 0)。

给定的输入/输出集用于为跳棋游戏开发神经网络。我猜它使用了与实现国际象棋相同的技术。

是否有可能为此开发一种算法?请为我提供一些指导或实施方法来执行此操作。也可以使用 OpenCV 函数。

4

2 回答 2

0

这是我将如何进行的。

让我们从{-1,1}分类问题的经典问题开始。f 表示您的(神经)网络。x 是您属于 RxR 的输入。y_obs 是属于 {-1,1} 的输出。

u_j 是 x 和 z 之间的权重,z 是中间输出,j 范围从 1 到 h,u_j 是 R^2 数组。w 是 z 和 y 之间的权重,y 是最终输出,w 是 R^h 数组。

当您输入网络时,您会得到属于 R 的 f(x)=y。训练神经网络包括在网络顶部添加标准 E(x,y_obs) 并尝试最小化该标准(对于二元分类问题,可以通过更新网络中的权重来最小化 (f(x)-y_obs)^2)。您的预测 g(x) 在训练结束时由 sign(f(x)) 给出。

因此,为了适应您在互联网上找到的解决方案,请创建一个神经网络 2 xhx 2,h 是隐藏单元的数量。然后,您需要在代码中定位函数标准,并将其替换为合适的标准,例如 2d 欧几里得范数。在这种情况下,您不需要实现任何预测函数 g,您的问题不是分类问题

您可能需要更改反向传播实现的定义以更新新的权重。对于 1-dim 输出,您有以下梯度来更新 w_j,j 的范围从 1 到 h(隐藏单元的数量)。

dE / dw_j = dE / dy * dy / dw_j
dE / du_jk = dE / dz_j * dz_j / du_jk 
           = dE / dy * dy / dz_j * dz_j / du_jk

(u_jk 是 u_j 的第 k 个分量,k=1,2)

有了新的情况,你会得到:

y_1 和 y_2 是 y 的分量。z 和 y 之间的 w_1 和 w_2 权重,w_1 和 w_2 是 R^h 数组。

dE / dw_1j = dE / dy_1 * dy_1 / dw_1j
dE / dw_2j = dE / dy_2 * dy_2 / dw_2j
dE / du_jk = dE / dz_j * dz_j / du_jk
           = dE / dy_1 * dy_1 / dz_j * dz_j / du_jk + dE / dy_2 * dy_2 / dz_j * dz_j / du_jk

右边的所有衍生品都由您的网络定义。

算法的精度对准则非常敏感,也许有比规范更复杂的解决方案。测试会告诉你!

于 2013-03-29T16:06:20.133 回答
0

您可以使用通用的反向传播算法。有许多来源解释了有关它的详细信息(例如它的维基百科页面)。但为了更好的结果,我有一个建议给你。

最好调节你的输入和输出。如果您为输入数据的每个组件添加一些常数,并将它们在训练数据上的平均值移动到接近 0,这将有助于网络更快更好地学习您的模式。

于 2013-03-30T01:32:34.347 回答