剑客
关注科技互联网

神经网络与深度学习笔记(一)

神经网络与深度学习笔记(一)

深度学习(Deep learning) 是现在很火的技术,对我来说不过就是个工具而已,就像Spring,Nginx 这些东西一样。这个系列的文章,会从公式,代码,原理等层面记录,但很基础的东西不会详细解释。

Perceptrons

简介

Nature Net Work(神经网络) 是多个Perceptrons(神经元或感知机)某种方式的组合。Perceptrons 的结构如下图: 神经网络与深度学习笔记(一) 可以用数学公式表示:

math
/displaystyle
output=f(WX+b)

{1},x {2},x
{3})^T$$ 权重向量:$$W=(w 1, w
2, w

3)$$ bias : $$b$$

此处的函数$$f$$有很多,比step function,Sigmoid function, Softmax function . Relu(Rectified Linear Units),tanh……应该还有很多,各有各的特色,在很多神经网络的Library 里面都能找到这些function 的实现。

上面这简单感知机,其实在实际生产的时候也是有效的,因为实现简单,而且在此基础之上还可以有些变化,来优化感知机。下面选用Sigmod 继续解释,因为Sigmod 用的比较多,很多公式我直接超就好了……。

实现

下面打算实现一个Perceptrons 分类器。实现的意思就是寻找上面模型中的参数$$W$$ 和$$b$$ 。当给定一堆样本的时候该如何才能得到需要的参数。在在寻找Perceptrons 参数的时候我们需要定义什么样的参数才是最好的参数。有了这个定义,才能进一步实施,机器学习的通用思想就是把问题转化成求解误差函数的最小值(这里不详细展开)。通常就是定义一个误差函数比如使用常用的二次函数:

math
E = /sum(1/2)(target-predit)^2

Gradient descent(梯度下降)

算法来实现。

那么问题来了什么是梯度下降算法,如果你一时搞不清楚其中的原理(推导过程)你可以先使用最中的结果来实现一些,然后如果有兴趣再去研究。

代码

使用下面的代码,可以直观的看到,一个效果 神经网络与深度学习笔记(一)

“`

class Perceptron(object): def init (self): # 感知机权重 self.weights = [] # 偏置 self.b = 0

def predict(self, x):
    z = sum(w * x for w, x in zip(self.weights, x)) + self.b
    # 此处本来是有激活函数的,鉴于此处是线性的,就直接使用借阅函数了
    a = z
    if a >= 0:
        return 1
    else:
        return -1

def train(self, inputs, iterations, rate=0.1):
    """

    :param inputs:  输入数据
    :param iterations:  迭代次数
    :param rate:  学习速率
    """
    self.weights = [0] * len(inputs[0][0])

    for iter in xrange(iterations):
        for X, Y in inputs:

            z = sum([w * x for w, x in zip(self.weights, X)]) + self.b
            a = z
            error = Y - a
            if Y * a <= 0:
                delta_list = [error * float(x) for x in X]
                self.weights = [w + rate * delta for w, delta in zip(self.weights, delta_list)]
                self.b += rate * delta

        right_count = 0
        for X, Y in inputs:
            pre_y = self.predict(X)
            if pre_y == Y:
                right_count += 1
        print "iter {}: {} /{}".format(iter, right_count, len(inputs))

if name == ‘ main ‘: from pylab import rand, norm import matplotlib.pyplot as plt # 产生输入数据 n = 100 xb = (rand(n) * 2 – 1) / 2 – 0.5 yb = (rand(n) * 2 – 1) / 2 + 0.5 xr = (rand(n) * 2 – 1) / 2 + 0.5 yr = (rand(n) * 2 – 1) / 2 – 0.5

inputs = []
for i in range(len(xb)):
    inputs.append([[xb[i], yb[i]], 1])
    inputs.append([[xr[i], yr[i]], -1])

#  train
classfication = Perceptron()
classfication.train(inputs, 100)

# 可视化
plt.figure()
plt.plot(xb, yb, 'ro')
plt.plot(xr, yr, 'bo')

n = norm(classfication.weights)
ww = classfication.weights / n
ww1 = [ww[1], -ww[0]]
ww2 = [-ww[1], ww[0]]
plt.plot([ww1[0], ww2[0]], [ww1[1], ww2[1]], '--k')
plt.show()

“`

理解上面的代码的关键在于梯度下降算法,对应到代码里,下面这两句。

delta_list = [error * float(x) for x in X]
self.weights = [w + rate * delta for w, delta in zip(self.weights, delta_list)]
self.b += rate * delta
分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址