【问题标题】:Simple neural network using linear algebra and scala breeze使用线性代数和 Scala 微风的简单神经网络
【发布时间】:2016-06-04 05:05:03
【问题描述】:

下面是我实现的具有 1 个输入层、2 个隐藏层和 1 个输出层的神经网络:

import breeze.linalg._
import breeze.math._
import breeze.numerics._

object NN extends App {

  //Forward propogation
  val x1 = DenseVector(1.0, 0.0, 1.0)
  val y1 = DenseVector(1.0, 1.0, 1.0)

  val theta1 = DenseMatrix((1.0, 1.0, 1.0), (1.0, 1.0, 0.0), (1.0, 0.0, 0.0));
  val theta2 = DenseMatrix((1.0, 1.0, 1.0), (1.0, 1.0, 0.0), (1.0, 0.0, 0.0));
  val theta3 = DenseMatrix((1.0, 1.0, 1.0), (1.0, 1.0, 0.0), (1.0, 0.0, 0.0));

  val a1 = x1;

  val z2 = theta1 * a1;
  val a2 = (z2.map { x => 1 + sigmoid(x) })

  val z3 = theta2 * a2;
  val a3 = (z3.map { x => 1 + sigmoid(x) })

  val z4 = theta3 * a3;
  val a4 = (z4.map { x => 1 + sigmoid(x) })

  //Back propagation
  val errorLayer4 = a4 - DenseVector(1.0, 1.0, 1.0)
  val errorLayer3 = (theta3.t * errorLayer4) :* (a3 :* (DenseVector(1.0, 1.0, 1.0) - a3))
  val errorLayer2 = (theta2.t * errorLayer3) :* (a2 :* (DenseVector(1.0, 1.0, 1.0) - a2))

  //Compute delta values
  val delta1 = errorLayer2 * a2.t
  val delta2 = errorLayer3 * a3.t
  val delta3 = errorLayer4 * a4.t


  //Gradient descent
  val m = 1
  val alpha = .0001
  val x = DenseVector(1.0, 0.0, 1.0)
  val y = DenseVector(1.0, 1.0, 1.0)

  val pz1 = delta1 - (alpha / m) * (x.t * (delta1 * x - y))
  val p1z1 = (sigmoid(delta1 * x)) + 1.0 
  println(p1z1);

  val pz2 = delta2 - (alpha / m) * (x.t * (delta2 * x - y))
  val p1z2 = (sigmoid(delta2 * p1z1)) + 1.0
  println(p1z2);

  val pz3 = delta3 - (alpha / m) * (x.t * (delta3 * x - y))
  val p1z3 = (sigmoid(delta3 * p1z2)) + 1.0
  println(p1z3);


}

这个网络的输出是:

Jun 03, 2016 7:47:50 PM com.github.fommil.netlib.BLAS <clinit>
WARNING: Failed to load implementation from: com.github.fommil.netlib.NativeSystemBLAS
Jun 03, 2016 7:47:50 PM com.github.fommil.jni.JniLoader liberalLoad
INFO: successfully loaded C:\Users\Local\Temp\jniloader3606930058943197684netlib-native_ref-win-x86_64.dll
DenseVector(2.0, 2.0, 1.9999999999946196)
DenseVector(1.0, 1.0, 1.0000000064265646)
DenseVector(1.9971047766732295, 1.9968279599465841, 1.9942769808711798)

我正在使用单个训练示例 101 和输出值 111。 当预测值应该是 1,1,1 时,给定 1,0,1 的预测值是 1.9,1.9,1.9

我认为我如何计算带有偏差的 sigmoid 是不正确的,是否应该在 layer 的 sigmoid 计算之后添加偏差 +1 值,换句话说,使用 { x =&gt; sigmoid(x+1) } 而不是 { x =&gt; 1 + sigmoid(x) }

【问题讨论】:

    标签: scala neural-network linear-algebra scala-breeze


    【解决方案1】:

    感知器式神经元的输出是 sigmoid(sum(xi * wi)),其中偏置输入x0 为 1,但权重不一定为 1。您绝对不会在 sigmoid 之外对 1 求和,但是你也不在里面总结。你需要一个重量。所以应该等价于

    sigmoid(w0 + w1*x1 + w2*x2 + ...)
    

    【讨论】:

    • 'sigmoid(w0 + w1*x1 + w2*x2 + ...)' 应该是 'sigmoid(w0x0 + w1*x1 + w2*x2 + ...)' 其中 x0 为 1 w0 是一个随机值?如果不是,偏差在哪里计算?
    • @blue-sky - w0 应该选择,但是您选择其他初始权重。 w0*x0 = w0*1 = w0,所以不是“应该”——你写的就是我写的。
    猜你喜欢
    • 2022-01-08
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2019-01-23
    • 1970-01-01
    • 2016-08-08
    相关资源
    最近更新 更多