前言
如何深入理解基本神经网络模型,对于使用机器学习框架的理解十分重要。本文主要参照 Milo Spencer 与 Trask 的论文进行阐述,感谢两位作者的辛勤付出。
以下内容,将带你一步步的从一个简单问题,从头构建一个神经网络。一旦你理解了,你可以喜欢的编程语言去实现它,本文使用Python作为示例。
最终代码
import numpy as np
# input dataset
x = np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1] ])
# output dataset
y = np.array([[0,0,1,1]]).T
# start
np.random.seed(1)
w0 = 2 * np.random.random((3,4)) - 1
w1 = 2 * np.random.random((4,1)) - 1
# l0 > w0 > l1 > w1 > l2 (y)
for i in range(60000):
l0 = x
l1 = 1/(1+np.exp(-(np.dot(l0,w0))))
l2 = 1/(1+np.exp(-(np.dot(l1,w1))))
delta1 = (y - l2)*(l2*(1-l2)) #(4,1)
delta0 = delta1.dot(w1.T)*(l1*(1-l1))
w1 += np.dot(l1.T, delta1)
w0 += np.dot(l0.T, delta0)
print(l2)
你可能发现这有点难以理解,好吧我们从头开始。继续下一章节。
我们在做什么?
理解基本问题至关重要,如果不理解最终目的,也就没法理解整个模型在干什么。
我们主要从数据输入、数据输出、优化,都在干什么来入手,一步步的构建一个神经网络。
数据输入输出
想象有一只狗,懒洋洋的躺在地上,你用手挠它身上三个部位(比如后背、头、肚子),它有可能会很兴奋。来看看如何用用数字量化我们的一次逗狗行为,架设输入1代表挠这个位置,0代表不挠这个位置;输出1代表狗狗兴奋,0代表没反应。 那么:
输入(后背、头、肚子) | 输出(兴奋、没反应) | ||
---|---|---|---|
1 | 1 | 1 | 1 |
从上表可见,我们同时刺激这条可怜小狗的后背、头、肚子,结果是它很兴奋! 下面的这个表就是我们实验4次的结果:
输入(后背、头、肚子) | 输出(兴奋、没反应) | ||
---|---|---|---|
0 | 0 | 1 | 0 |
1 | 1 | 1 | 1 |
1 | 0 | 1 | 1 |
0 | 1 | 1 | 0 |
以上表格中的输入区域,每一行的三个值就是我们的一次尝试。四次分别用了不同的组合,比如第一次至挠肚子,狗狗没反应。以此类推。
那么,我们怎么确定一种刺激方法,能让狗狗兴奋呢?(逗狗狂魔)换句话说,怎么刺激这条狗的三个部位,哪个地方轻,哪个地方重?是摸摸头和摸摸背组合,还是摸摸头和摸摸肚子组合?
我们需要确定这三个部位的权重!
基本神经网络
未完待续…