我想用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函数。
回答:
以下是我会采取的步骤。
让我们从经典的{-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数组。
当你向网络输入数据时,你得到f(x)=y,属于R。训练神经网络包括在网络之上添加一个标准E(x,y_obs),并尝试最小化这个标准(对于二元分类问题,可以最小化(f(x)-y_obs)^2)通过更新网络中的权重。你的预测g(x)在训练结束时由sign(f(x))给出。
因此,为了将你在网上找到的实现适应你的问题,创建一个2 x h x 2的神经网络,h是隐藏单元的数量。然后,你需要在代码中找到标准函数,并用一个合适的标准替换它,例如二维欧几里得范数。在这种情况下,你不需要实现任何预测函数g,你的问题不是分类问题。
你可能需要更改反向传播实现的定义来更新新的权重。对于你的一维输出,你有以下梯度来更新w_j,j的范围从1到h(隐藏单元的数量)。
dE / dw_j = dE / dy * dy / dw_jdE / 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的分量。w_1和w_2是z和y之间的权重,w_1和w_2是R^h数组。
dE / dw_1j = dE / dy_1 * dy_1 / dw_1jdE / dw_2j = dE / dy_2 * dy_2 / dw_2jdE / 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
右侧的所有导数都由你的网络定义。
算法的精度对标准非常敏感,可能有比范数更复杂的解决方案。测试会告诉我们答案!