微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么某些神经网络结构无法解决问题?

如何解决为什么某些神经网络结构无法解决问题?

我正在玩我为xor-ing编写的神经网络代码。我写了这个模型:

import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt

model = keras.Sequential()
model.add(tf.keras.Input(shape=(2,)))
#model.add(keras.layers.Dense(2))
model.add(keras.layers.Dense(4,activation='relu'))
model.add(keras.layers.Dense(16,activation='relu'))
model.add(keras.layers.Dense(1,activation='sigmoid'))

optimizer = keras.optimizers.Adam(lr=0.2) #for example
model.compile(optimizer=optimizer,loss=tf.losses.BinaryCrossentropy(),metrics=['accuracy'])

# X_train,Y_train = ([[0,0],[0,1],[1,1]],[[0],[1],[0]])
X_train = tf.cast([[0,tf.float32)
Y_train = tf.cast([0,1,tf.float32)

# train model and plot loss
hist = model.fit(X_train,Y_train,epochs=10000)
plt.plot(hist.history['loss'])
plt.show()

print(model.predict([[0,1]]))
print(model.predict([[1,0]]))
print(model.predict([[0,0]]))

在此模型中,有一半的时间我将获得100%的准确性,而在一半的时间中我将仅获得75%(有时甚至50%)的准确性。即使经过10000个纪元,模型也找不到适合的方法

我注意到,只需按下面的代码所示切换图层,就可以始终保持100%的准确性。。

model.add(tf.keras.Input(shape=(2,)))
#model.add(keras.layers.Dense(2))
#model.add(keras.layers.Dense(4,activation='sigmoid'))

问题

为什么会这样?为什么即使在10K历时之后,这个简单的模型也无法很好地适应,而新模型需要少于500历时?是什么使旧模型特别收敛到该百分比?

解决方法

对于异或问题架构,2个隐藏的1个输出神经元能够解决它。我要说的第一件事是我们对问题的认识。我了解到,对于我们来说,这对人类来说是微不足道的,但这并不意味着对于这些简单的网络而言也是微不足道的。

XOR是线性不可分问题的典型例证。根据我的经验,当我尝试使用[2,1]架构解决它时,我虽然成功了,但它也经历了很多时期。

第二,这些架构有时无法在给定的时期解决。几乎可以保证,如果您训练更长的时间,就会得出结论(有时会太长)。

第三件事是。我提到过[2,1]可以解决这个问题。让我们关注2。2个隐藏的神经元表示您有两个输入的非线性组合。因此,将二维空间映射到二维空间,非线性使您有机会在这个新空间将输入分离。这就是问题,对于神经网络来说,在此映射处进行这种分离也许很难。当您使用16个“隐藏”时,您会创建16个非线性组合,从结果中我们会发现,找到较好的分离更容易。

,

每当您观察到多次运行相同的网络配置导致非常不同的行为时,就意味着初始权重配置(这是两次运行之间的唯一区别)是造成这种情况的原因。但是,这并不意味着初始化方案有问题。这可能只是意味着梯度下降在您提供的初始化附近很快就卡在了参数空间中。

发生这种情况的主要原因之一是学习率过高:网络过早跳到了本地最小值,但卡在了这个山谷的边缘,而不是它的最小值。如果将学习率更改为lr=0.01,您将看到该网络每次都具有100%的准确性。

我的猜测是,您提供的另一个网络的学习率较高,因为它具有较少的参数,因此需要对其进行操作的参数空间更简单。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。