我正在玩神经网络试图根据你需要解决的问题来理解设计架构的最佳实践.
我生成了一个由单个凸区域组成的非常简单的数据集,如下所示:

当我使用L = 1或L = 2隐藏层(加上输出层)的架构时,一切正常,但是当我添加第三个隐藏层(L = 3)时,我的性能下降到略好于机会.
我知道你添加到网络中的复杂性越多(要学习的权重和参数的数量),你越倾向于过度拟合数据,但我认为这不是我问题的本质,原因有两个:
任何人都可以帮助我理解为什么添加一个额外的隐藏层会让我在这么简单的任务中失败?
这是我的表现图像作为所用图层数量的函数:

补充部分评论如下:
L(s) = 1 / 1 + exp(-s)用于计算梯度的反向传播算法已被多次重新发现,并且是在反向累积模式中称为自动微分的更通用技术的特殊情况.
有人可以用这个来解释这个问题吗?被区分的功能是什么?什么是"特例"?它是使用的伴随值本身还是最终的渐变?
algorithm automatic-differentiation calculus backpropagation neural-network
我试图backpropagation在一个简单的3层神经网络中理解MNIST.
有输入层weights和a bias.标签是MNIST如此,它是一个10类向量.
第二层是linear tranform.第三层是softmax activation将输出作为概率.
Backpropagation 计算每一步的导数并将其称为梯度.
以前的图层将渐变global或previous渐变附加到local gradient.我无法计算local gradient的softmax
在线的几个资源通过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) 我怀疑的是如何在Pooling层中反向传播错误,因为当我计算导数时,只有4个元素(例如,当使用2x2池内核时)会影响前馈的结果.
machine-learning convolution backpropagation neural-network conv-neural-network
给定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)
一些笔记
tf.gradients(x, tf.trainable_variables())崩溃AttributeError: 'WhileContext' object has no attribute 'pred'.似乎tf.gradients在循环中使用的唯一可能性是仅计算相对于weight_1和x_in/时间步的当前值的梯度而不反向传播时间.我已经为神经网络编写了以下反向传播例程,使用此处的代码作为示例.我面临的问题让我感到困惑,并将我的调试技巧推向了极限.
我面临的问题相当简单:随着神经网络的训练,其权重被训练为零而精度没有提高.
我试图多次修复它,验证:
一些信息:
我不知道从哪里开始.我已经验证了我所知道要检查的所有内容都运行正常,而且它仍然无法正常工作,所以我在这里问.以下是我用来反向传播的代码:
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) 有人能否清楚解释LSTM RNN的反向传播?这是我正在使用的类型结构.我的问题不在于什么是反向传播,我理解它是一种计算用于调整神经网络权重的假设和输出误差的逆序方法.我的问题是LSTM反向传播与常规神经网络的不同之处.
我不确定如何找到每个门的初始误差.您是否使用每个门的第一个误差(由假设减去输出计算)?或者你通过一些计算调整每个门的误差?我不确定细胞状态如何在LSTM的反向支持中发挥作用.我已经彻底查看了LSTM的良好来源,但还没有找到任何.
machine-learning backpropagation neural-network lstm recurrent-neural-network
如果我理解正确,要在 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 了,我没有计划也没有时间测试发布的答案。
我目前正在用普通的 numpy 实现一个 CNN,并且有一个关于最大池层反向传播的特殊情况的简短问题:
虽然很明显非最大值的梯度消失了,但我不确定切片的几个条目等于最大值的情况。严格来说,函数在这个“点”上不应该是可微的。但是,我认为可以从相应的次微分中选择一个次梯度(类似于在 x=0 处为 Relu 函数选择次梯度“0”)。
因此,我想知道简单地形成关于最大值之一的梯度并将剩余的最大值视为非最大值是否就足够了。
如果是这种情况,是否建议随机选择最大值以避免偏差,还是总是选择第一个最大值?
python backpropagation deep-learning conv-neural-network max-pooling
我用 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
backpropagation ×10
python ×6
algorithm ×1
calculus ×1
convolution ×1
keras ×1
lstm ×1
max-pooling ×1
numpy ×1
softmax ×1
tensorflow ×1
while-loop ×1