简单 Python 神经网络中的泄漏 ReLU

数据挖掘 Python 神经网络 激活函数
2021-10-06 05:47:39

为了构建一个简单的 1 层神经网络,许多教程使用 sigmoid 函数作为激活函数。根据学术文章和其他在线资源,泄漏的 ReLU 是更好的选择;但是,我找不到改变我的代码片段以允许泄漏 ReLU 的方法。

我尝试if x > 0 then x else x/100了像激活函数这样的逻辑,然后对导数也一样。

是否因为输出层不能有 ReLU 而失败?我应该将第一层更改为 ReLU,然后添加一个 softmax 输出层吗?

import numpy as np
np.random.seed(1)

X = np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]])
y = np.array([[0,1,0,1]]).T

class NN:
  def __init__(self, X, y):
    self.X = X
    self.y = y
    self.W = np.random.uniform(-1, 1, (X.shape[1], 1))
    self.b = np.random.uniform(-1, 1, (X.shape[1], 1))

  def nonlin(self, x, deriv=False):
    if deriv:
      return x*(1-x)
    return 1/(1+np.exp(-x))

  def forward(self):
    self.l1 = self.nonlin(np.dot(self.X, self.W + self.b))
    self.errors = self.y - self.l1
    print(abs(sum(self.errors)[0]))

  def backward(self):
    self.l1_delta = self.errors * nonlin(self.l1, True)
    self.W += np.dot(self.X.T, self.l1_delta)
    self.b += np.dot(self.X.T, self.l1_delta)

  def train(self, epochs=20):
    for _ in range(epochs):
      self.forward()
      self.backward()

nn = NN(X, y)
nn.train()
1个回答

我假设您正在处理的任务是二进制分类任务,因为y = np.array([[0,1,0,1]]).T. 作为一个错误函数,你使用self.errors = self.y - self.l1. 现在将其与泄漏的 ReLU 函数的曲线进行比较:

泄漏的 ReLU

泄漏的 ReLU 是一个无界函数。您的网络应该如何对输出值是元素的二元分类任务进行建模{0,1}使用这个功能?将绝对差作为误差函数应用于标签的结果是什么是的{0,1}和你的输出是的^(-,)?

您需要将 lReLU 输出转换为您的类,例如prediction = 1.0 if activation >= 0.0 else 0.0.

这就是为什么将最后一层激活函数应用于分类问题更为常见的原因之一,分类问题可以解释为类概率,例如 Softmax 或 Sigmoid:

在此处输入图像描述

您仍然需要一个阈值来从实值输出(被解释为概率)移动到二进制类标签,但这相当简单,因为您通常只需将其设置为0.5.

我建议您从头开始实施教程。如果你愿意退后一步,这里是一个简单的感知器(即只有一个神经元)。


图片取自这篇文章