【问题标题】:How to create a neural network that has a dynamic input?如何创建具有动态输入的神经网络?
【发布时间】:2016-09-08 14:42:04
【问题描述】:

这个问题很难回答:我怎样才能给神经网络提供动态输入?

回答这个问题肯定会有助于现代人工智能的进步,将深度学习用于计算机视觉和语音识别以外的应用。 我将为神经网络的外行进一步解释这个问题。

我们以这个简单的例子为例:

假设您需要知道在“井字游戏”游戏中获胜、失败或平局的概率。

所以我的输入可以是一个表示状态的 [3,3] 矩阵(1-You, 2-Enemy, 0-Empty):

[2. 1. 0.]  
[0. 1. 0.] 
[2. 2. 1.]

假设我们已经有一个先前训练的隐藏层,一个 [3,1] 权重矩阵:

[1.5]  
[0.5]  
[2.5]

因此,如果我们使用一个简单的激活函数,该函数基本上由两个 y(x)=W*x 之间的矩阵相乘组成,我们会在 中得到这个 [3,1] 矩阵输出

[2. 1. 0.]     [1.5]     [3.5]
[0. 1. 0.]  *  [0.5]  =  [0.5]
[2. 2. 1.]     [2.5]     [6.5]

即使没有 softmax 函数,您也可以判断出最高概率是平局。

但如果我想让同样的神经网络在 5x5 井字游戏中工作呢?

它的逻辑与 3x3 相同,只是更大。神经网络应该能够处理它

我们会有类似的东西:

[2. 1. 0. 2. 0.]
[0. 2. 0. 1. 1.]     [1.5]     [?]
[2. 1. 0. 0. 1.]  *  [0.5]  =  [?]                           IMPOSSIBLE
[0. 0. 2. 2. 1.]     [2.5]     [?]
[2. 1. 0. 2. 0.]

但是这种乘法无法计算。我们将不得不添加更多层和/或更改我们之前训练的层重新训练它,因为未经训练的权重(在这种情况下初始化为 0)会导致神经网络失败,就像这样:

     input            1st Layer        output1
[2. 1. 0. 2. 0.]     [0.  0. 0.]     [6.5 0. 0.]
[0. 2. 0. 1. 1.]     [1.5 0. 0.]     [5.5 0. 0.]
[2. 1. 0. 0. 1.]  *  [0.5 0. 0.]  =  [1.5 0. 0.]
[0. 0. 2. 2. 1.]     [2.5 0. 0.]     [6.  0. 0.]
[2. 1. 0. 2. 0.]     [0.  0. 0.]     [6.5 0. 0.]

   2nd Layer           output1      final output
                     [6.5 0. 0.]
                     [5.5 0. 0.]
[0. 0. 0. 0. 0.]  *  [1.5 0. 0.]  =  [0. 0. 0.]                POSSIBLE
                     [6.  0. 0.]
                     [6.5 0. 0.]

因为我们扩展了第一层并添加了一个零权重的新层,所以我们的结果显然没有定论。如果我们应用一个 softmax 函数,我们将意识到神经网络为每个可能的结果返回 33.3% 的机会。 我们需要再次训练它

显然我们想要创建可以适应不同输入大小的通用神经网络,但是我还没有想到解决这个问题的方法!所以我想也许stackoverflow可以提供帮助。千千万万个脑袋比一个脑袋好。 有什么想法吗?

【问题讨论】:

  • 就像在图像方法中一样,您将训练一个固定大小的 NN 并预缩放您的输入(如图像调整大小)。这很常见,它可能是目前最好的工作方法。还要记住,玩家 1 和 2 的 1/2 编码与最佳方法(-1/1 甚至多个平面)相去甚远。再说一句,因为您似乎对 NN 和 Game-AI 没有太多经验:3 值输出是 hm。通常有两种方法:价值网络或策略网络。前者输出一个描述分数的值(从当前玩家的角度来看),后者输出一个关于移动的 PDF。
  • 是的,但是有像井字棋这样的例子,我们不能在不丢失信息的情况下调整输入的大小。这仅适用于几个像素无关紧要的图像。我们需要一个更好的方法来做到这一点。至于例子的注释,是的,可能不是最好的选择,我只是快速拼凑起来帮助解释。

标签: neural-network deep-learning matrix-multiplication max-pooling


【解决方案1】:

除了将输入大小调整为固定大小之外,还有卷积神经网络的解决方案。

Spatial Pyramid Pooling 允许您使用可变大小的图像训练和测试 CNN,它通过引入动态池化层来实现这一点,其中输入可以是任意大小,输出是固定大小,然后可以被馈送到全连接层。

池化非常简单,在每个维度上定义多个区域(比如 7x7),然后该层将每个特征图拆分为不重叠的 7x7 区域,并对每个区域进行最大池化,输出 49元素向量。这也可以在多个尺度上应用。

【讨论】:

  • 我之前在训练图像分类 CNN 时使用过最大池化,但问题是,在某些情况下,我们需要输入中的所有数据......我们不能只使用最大池化一个整个区域并丢失大量数据......例如:上面“井字游戏”问题上的每个数字对于它的分类至关重要。如果我只是删除一些数字,状态将完全不同,并被毁掉......
  • @GabrielDiasRezendeMartins Max-Pooling 在卷积特征图上执行,而不是在输入上。网络学习如何解释这种池化输出。
  • 对于像这样的例子,特征图是什么?我知道这就是它对图像的工作原理,但这只是一个状态矩阵。每个数字都很重要。
  • @GabrielDiasRezendeMartins 图像只是一个矩阵,卷积神经网络(通过过滤器)学习特征图。这种网络可以应用于任何类型的具有局部结构的矩阵输入。您必须尝试看看它是否有效。
  • 您是否暗示我将状态上的卷积应用到第三维,然后将其最大池化为固定形状?我几乎不认为它会起作用。假设 5x5 变成了 3x3。 NN 怎么知道这个 3x3 状态实际上是代表一个 5x5 而不是实际上是一个 3x3?这个 3x3 整数矩阵将被处理,就好像它开始时是 3x3 一样,原始状态丢失了。如果我们将 5x5 任意角落的 4 个单元格(例如:0 1 和 1 0)变成一个单元格,即 3x3 的角落(例如:1),那么所有信息都会丢失,现在只是一个单人游戏而不是 4 人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 2012-10-05
  • 2016-02-03
  • 2018-02-28
  • 1970-01-01
相关资源
最近更新 更多