入门神经网络:前馈

下一篇传送门

英文原文,虽然也是我写的 Chinglish,但是因为之前在加拿大某小村校上学导致中文术语可能会表述不准。

文章和代码都在这儿,用来骗 欢迎Star GitHub repo

准备工作

读懂这篇文章,需要你有以下方面的知识

  • 如何求导数
  • 基本的矩阵乘法

如果有下列知识就更好了

  • 懂一点机器学习的知识,比如线性回归
  • 知道什么是 感知机(perceptron)

有任何没看懂的部分,欢迎留言,信不信我半小时内秒回。

一个巨简单的神经网络(A Deadly Simple NN)

如果你对神经网络(neural network)感兴趣或者关注过相关的文章,那下图中的这个模型想必你不会感觉很陌生。

一个人工神经网络模型

不过这个可能对于初学者有点不太友好?那看看下面这个简化版的

一个无隐层的神经网络

图里的这些东西,咱们一个一个的捋一遍。每个蓝色的圆代表一个神经元(neuron)。每个方块代表一个运算,比如 + 代表求和。上图中最左边的三个神经元组成了输入层(input layer),包含一个 h 的神经元组成了输出层(output layer),并且这一层只有这一个神经元。

输出层神经元的输入值

对于生物学意义上的神经元来说,通常存在一个阈值(threshold)来使其达到兴奋的状态,也就是被激活。在我们所讨论的神经网络中,我们的神经元将会通过输入值和激活函数(activation function)计算一个输出值。激活函数最值得称赞的一点就是它可以是任何类型的函数,包括但不限于跃阶函数,多项式函数或者 sigmoid 函数。h 是输出神经元的输入值,结合激活函数,输出神经元会输出 f(h) 计算的结果 y,也就是整个神经网络的输出值。

如果你选择 f(h) = h 作为你的激活函数,那么你的神经网络输出结果将会是下图中的这个公式,这里 y = f(h)

神经网络的输出

如果你觉得这看起来是一个线性回归的模型,那就对了。如果你的激活函数是连续可导的,那么(通常情况下)你就可以使用一个叫做 梯度下降(gradient descent) 的方法来训练你的网络。不过这理解起来要稍微麻烦一点,在我们深入到训练的步骤之前,我们先来编写一个很简单的程序来了解神经网络作出预测的过程。我们将使用 sigmoid 函数作为激活函数, Python 作为编程语言。预测的这个过程是一种前馈(feedforward)的计算,仅仅有这一部分的神经网络是不能学习的(例如,通过反向传播(backpropagation)),但我们稍后再关注训练学习的部分。

Sigmoid 函数
import numpy as np

def sigmoid(x):
    # sigmoid function
    return 1/(1 + np.exp(-x))

inputs = np.array([0.7, -0.3])
weights = np.array([0.1, 0.8])
bias = -0.1

# calculate the output
output = sigmoid(np.dot(weights, inputs) + bias)

print('Output:')
print(output)

代码跟这儿呢

第一个单隐层神经网络(Your First 2-Layer NN)

注:单隐层,即为包括一个隐层,一个输出层的神经网络,输入层和输出层因为是必须的,所以不计数。

现在你已经基本知道了一个神经网络是怎么计算预测结果的。在现实生活中,我们面临的预测问题往往十分复杂,这样简单的网络结构可能远远不够。这里我们要引入一个新的概念,隐层(hidden layer)

一个拥有三个输入层神经元,两个隐层神经元和一个输出层神经元的神经网络

在第一部分那个简单的网络模型中,我们的权重(weight)是一个向量。但是对于多数神经网络来说,其实权重将会是一个如下图一样的矩阵。

三个输入层神经元和两个隐层神经元的权重矩阵

结合第一部分的理解和上面单隐层神经网的模型,你也许已经知道怎么通过这个模型计算 h1 的具体数值了。我们给出一个简单的公式定义

计算隐层神经元输入值的公式

对于我们所关注的这个单隐层模型来说,它是下面这样的

计算隐层输入值的矩阵乘法

注意!!:上图中的权重下角标已经更改为矩阵的表达方式,并不是和单隐层神经网络图中的下角标所对应的。因为在矩阵的表达方法中,是用行/列的顺序来标注的。所以如果用示意图中的方法标注的话,会造成一些误会。

用先前神经网络模型图中的下角标所标注的矩阵

记住,上图中的这个计算过程使用的并非是矩阵使用的角标,但这个和我们上面单隐层神经网络的示意图中的标注是一致的。

结合上面所学的知识,我们可以快速构建一个单隐层神经网络的前馈(即预测)过程了。我们仍然使用 sigmoid 函数作为我们的激活函数(并且在之后很长时间都会用这个函数)。

待办事项:

  • 计算隐层的输入值
  • 计算隐层的输出值
  • 计算输出层的输出值
  • 计算输出层的输出值
import numpy as np

def sigmoid(x):
    # sigmoid function
    return 1/(1+np.exp(-x))

# 神经网络各层神经元数量
N_input = 3
N_hidden = 2
N_output = 1

np.random.seed(42)
# Make some fake data
X = np.random.randn(4)

# 生成输入层到隐层/隐层到输出层权重
weights_in_hidden = np.random.normal(0, scale=0.1, size=(N_input, N_hidden))
weights_hidden_out = np.random.normal(0, scale=0.1, size=(N_hidden, N_output))

# 计算隐层的输入值/输出值
hidden_layer_in = np.dot(X, weights_in_hidden)
hidden_layer_out = sigmoid(hidden_layer_in)

print('Hidden-layer Output:')
print(hidden_layer_out)

# 计算输出层的输入值/输出值
output_layer_in = np.dot(hidden_layer_out, weights_hidden_out)
output_layer_out = sigmoid(output_layer_in)

print('Output-layer Output:')
print(output_layer_out)

代码在这儿

参考资料

Thanks for reading. If you find any mistake/typo in this blog, please don't hesitate to let me know, you can reach me by email: jyang7[at]ualberta.ca

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,585评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,923评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,314评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,346评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,718评论 3 291
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,828评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,020评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,758评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,486评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,722评论 2 251
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,196评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,546评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,211评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,132评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,916评论 0 200
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,904评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,758评论 2 274

推荐阅读更多精彩内容