标签: backpropagation

神经网络结构设计

我正在玩神经网络试图根据你需要解决的问题来理解设计架构的最佳实践.

我生成了一个由单个凸区域组成的非常简单的数据集,如下所示:

在此输入图像描述

当我使用L = 1或L = 2隐藏层(加上输出层)的架构时,一切正常,但是当我添加第三个隐藏层(L = 3)时,我的性能下降到略好于机会.

我知道你添加到网络中的复杂性越多(要学习的权重和参数的数量),你越倾向于过度拟合数据,但我认为这不是我问题的本质,原因有两个:

  • 我在训练集上的表现也是60%左右(而过度拟合通常意味着你的训练误差非常低,测试误差很大),
  • 而且我有大量的数据示例(不要看那个只有我上传的玩具人物的数字).

任何人都可以帮助我理解为什么添加一个额外的隐藏层会让我在这么简单的任务中失败?

这是我的表现图像作为所用图层数量的函数:

在此输入图像描述

补充部分评论如下:

  • 我正在使用sigmoid函数,假设值介于0和1之间, L(s) = 1 / 1 + exp(-s)
  • 我正在使用早期停止(在40000次反向提升之后)作为停止学习的标准.我知道这不是停止的最佳方式,但我认为这对于这样一个简单的分类任务是可以的,如果你认为这是我不融合的主要原因II可能会实现一些更好的标准.

artificial-intelligence backpropagation neural-network

10
推荐指数
1
解决办法
2040
查看次数

反向传播与反向自动微分的相同(或不相同)如何?

反向传播维基百科页面有这样的主张:

用于计算梯度的反向传播算法已被多次重新发现,并且是在反向累积模式中称为自动微分的更通用技术的特殊情况.

有人可以用这个来解释这个问题吗?被区分的功能是什么?什么是"特例"?它是使用的伴随值本身还是最终的渐变?

algorithm automatic-differentiation calculus backpropagation neural-network

10
推荐指数
2
解决办法
1647
查看次数

numpy:计算softmax函数的导数

我试图backpropagation在一个简单的3层神经网络中理解MNIST.

有输入层weights和a bias.标签是MNIST如此,它是一个10类向量.

第二层是linear tranform.第三层是softmax activation将输出作为概率.

Backpropagation 计算每一步的导数并将其称为梯度.

以前的图层将渐变globalprevious渐变附加到local gradient.我无法计算local gradientsoftmax

在线的几个资源通过softmax及其衍生物的解释,甚至给出了softmax本身的代码样本

def softmax(x):
    """Compute the softmax of vector x."""
    exps = np.exp(x)
    return exps / np.sum(exps)
Run Code Online (Sandbox Code Playgroud)

所述衍生物相对于解释时i = j和当i != j.这是一个简单的代码片段,我想出来并希望验证我的理解:

def softmax(self, x):
    """Compute the softmax of vector x."""
    exps = np.exp(x)
    return exps / np.sum(exps)

def forward(self):
    # self.input …
Run Code Online (Sandbox Code Playgroud)

python numpy backpropagation neural-network softmax

10
推荐指数
3
解决办法
2万
查看次数

CNN中的池化层(子放大层)中的反向传播

我怀疑的是如何在Pooling层中反向传播错误,因为当我计算导数时,只有4个元素(例如,当使用2x2池内核时)会影响前馈的结果.

machine-learning convolution backpropagation neural-network conv-neural-network

10
推荐指数
1
解决办法
3263
查看次数

计算tf.while_loop的每个时间步的渐变

给定TensorFlow tf.while_loop,如何计算x_out每个时间步长相对于网络所有权重的梯度?

network_input = tf.placeholder(tf.float32, [None])
steps = tf.constant(0.0)

weight_0 = tf.Variable(1.0)
layer_1 = network_input * weight_0

def condition(steps, x):
    return steps <= 5

def loop(steps, x_in):
    weight_1 = tf.Variable(1.0)
    x_out = x_in * weight_1
    steps += 1
    return [steps, x_out]

_, x_final = tf.while_loop(
    condition,
    loop,
    [steps, layer_1]
)
Run Code Online (Sandbox Code Playgroud)

一些笔记

  1. 在我的网络中,条件是动态的.不同的运行将以不同的次数运行while循环.
  2. 呼叫tf.gradients(x, tf.trainable_variables())崩溃AttributeError: 'WhileContext' object has no attribute 'pred'.似乎tf.gradients在循环中使用的唯一可能性是仅计算相对于weight_1x_in/时间步的当前值的梯度而不反向传播时间.
  3. 在每个时间步骤中,网络将输出概率分布而不是动作.然后,需要渐变来实现策略梯度.

python while-loop backpropagation tensorflow

10
推荐指数
1
解决办法
1226
查看次数

为什么这种反向传播实施无法正确训练权重?

我已经为神经网络编写了以下反向传播例程,使用此处的代码作为示例.我面临的问题让我感到困惑,并将我的调试技巧推向了极限.

我面临的问题相当简单:随着神经网络的训练,其权重被训练为零而精度没有提高.

我试图多次修复它,验证:

  • 训练集是正确的
  • 目标向量是正确的
  • 前进步骤是正确记录信息
  • 后退步增加正确记录
  • 三角洲的迹象是正确的
  • 确实正在调整权重
  • 输入图层的增量全部为零
  • 没有其他错误或溢出警告

一些信息:

  • 训练输入是表示强度的8×8网格[0,16]值; 此网格表示数字数字(转换为列向量)
  • 目标矢量是在对应于正确数字的位置中为1的输出
  • 原始权重和偏差由高斯分布指定
  • 激活是标准的sigmoid

我不知道从哪里开始.我已经验证了我所知道要检查的所有内容都运行正常,而且它仍然无法正常工作,所以我在这里问.以下是我用来反向传播的代码:

def backprop(train_set, wts, bias, eta):
    learning_coef = eta / len(train_set[0])

    for next_set in train_set:
        # These record the sum of the cost gradients in the batch
        sum_del_w = [np.zeros(w.shape) for w in wts]
        sum_del_b = [np.zeros(b.shape) for b in bias]

        for test, sol in next_set:
            del_w = [np.zeros(wt.shape) for wt in wts]
            del_b = [np.zeros(bt.shape) for bt in bias]
            # …
Run Code Online (Sandbox Code Playgroud)

python backpropagation neural-network

9
推荐指数
1
解决办法
334
查看次数

LSTM RNN反向传播

有人能否清楚解释LSTM RNN的反向传播?这是我正在使用的类型结构.我的问题不在于什么是反向传播,我理解它是一种计算用于调整神经网络权重的假设和输出误差的逆序方法.我的问题是LSTM反向传播与常规神经网络的不同之处.

在此输入图像描述

我不确定如何找到每个门的初始误差.您是否使用每个门的第一个误差(由假设减去输出计算)?或者你通过一些计算调整每个门的误差?我不确定细胞状态如何在LSTM的反向支持中发挥作用.我已经彻底查看了LSTM的良好来源,但还没有找到任何.

machine-learning backpropagation neural-network lstm recurrent-neural-network

9
推荐指数
2
解决办法
6154
查看次数

keras 中的截断反向传播,每批次一个序列

如果我理解正确,要在 keras 中执行 TBPTT,我们必须将我们的序列分成 k 个时间步长的较小部分。根据 keras 的文档,要在序列的所有部分重用 LSTM 的状态,我们必须使用有状态参数:

您可以将 RNN 层设置为“有状态”,这意味着为一个批次中的样本计算的状态将被重新用作下一个批次中样本的初始状态。这假设不同连续批次中的样品之间存在一对一映射。

所以如果我理解正确,第一批的第一个样本是第一个序列的第一个部分,第二批的第一个样本是第一个序列的第二个部分,等等。我有 125973 个长度为 1000 的序列,我分成40 个 k=25 时间步长的序列。所以我的模型应该训练 40 个批次,包含 125973 个 25 个时间步长的序列。我的问题是我的 GPU(quadro K2200,我很穷)的内存,125973 的批量大小似乎太多了。我想知道是否可以将 LSTM 的状态保持在同一批次内并在批次之间重置它,因此我应该将批次大小设为 40 和 125973 批次。

这是我的模型:

model = Sequential()
model.add(Embedding(len(char_to_num), 200, mask_zero=True, batch_input_shape=(batch_size, k)))
model.add(Dropout(0.5))
model.add(LSTM(512, activation='relu', return_sequences=True, stateful=True))
model.add(Dropout(0.5))
model.add(TimeDistributed(Dense(len(char_to_num), activation='softmax')))

model.compile(loss='sparse_categorical_crossentropy', optimizer='adam')
model.summary()
Run Code Online (Sandbox Code Playgroud)

EDIT 2021
今年已经有了最近的答案,但这是一个老问题。与此同时,图书馆、DL 和 NLP 的状态发生了很大变化,我已经从 LSTM 转向了 Transformers。我已经很多年没有使用 LSTM 了,我没有计划也没有时间测试发布的答案。

python backpropagation deep-learning keras

9
推荐指数
1
解决办法
1343
查看次数

最大池化层的反向传播:多个最大值

我目前正在用普通的 numpy 实现一个 CNN,并且有一个关于最大池层反向传播的特殊情况的简短问题:

虽然很明显非最大值的梯度消失了,但我不确定切片的几个条目等于最大值的情况。严格来说,函数在这个“点”上不应该是可微的。但是,我认为可以从相应的次微分中选择一个次梯度(类似于在 x=0 处为 Relu 函数选择次梯度“0”)。

因此,我想知道简单地形成关于最大值之一的梯度并将剩余的最大值视为非最大值是否就足够了。

如果是这种情况,是否建议随机选择最大值以避免偏差,还是总是选择第一个最大值?

python backpropagation deep-learning conv-neural-network max-pooling

9
推荐指数
1
解决办法
837
查看次数

在强化学习的策略梯度中反向传播什么损失或奖励?

我用 Python 编写了一个小脚本来解决具有策略梯度的各种 Gym 环境。

import gym, os
import numpy as np
#create environment
env = gym.make('Cartpole-v0')
env.reset()
s_size = len(env.reset())
a_size = 2

#import my neural network code
os.chdir(r'C:\---\---\---\Python Code')
import RLPolicy
policy = RLPolicy.NeuralNetwork([s_size,a_size],learning_rate=0.000001,['softmax']) #a 3layer network might be ([s_size, 5, a_size],learning_rate=1,['tanh','softmax'])
#it supports the sigmoid activation function also
print(policy.weights)

DISCOUNT = 0.95 #parameter for discounting future rewards

#first step
action = policy.feedforward(env.reset)
state,reward,done,info = env.step(action)

for t in range(3000):
    done = False
    states = [] #lists for …
Run Code Online (Sandbox Code Playgroud)

python reinforcement-learning backpropagation policy-gradient-descent

9
推荐指数
1
解决办法
549
查看次数