抽象的艺术 - 感知器

简介: You keep using that word, but I don't think it means what you think it means. 就像上面说的这句话,每当看见“神经网络”这个词的时候,我都是懵逼的,到底啥是神经网络?和深度学习有啥关系?你瞅啥? ## 懵逼史 作为一个长期进行业务开发的我,在机缘巧合下开始接触算法。刚开始是看各种业务场景如何运用机器学习算法分

You keep using that word, but I don't think it means what you think it means.

就像上面说的这句话,每当看见“神经网络”这个词的时候,我都是懵逼的,到底啥是神经网络?和深度学习有啥关系?你瞅啥?

懵逼史

作为一个长期进行业务开发的我,在机缘巧合下开始接触算法。刚开始是看各种业务场景如何运用机器学习算法分析和预测的文章,看完之后觉得作者非常牛逼,但是自己是懵逼的。感觉就像耍猴一样,还没学会站着走,就要玩穿火圈了。为了穿火圈,开始了一枚程序猿走野路子学算法的奇葩。就像机器学习里面提到的无监督学习,监督学习,增强学习一样,人类学习任何知识的过程,站在上帝视角来看,人类更像在使用增强学习不断修正对世界的认知模型。还是有一些漏洞,人与人之前的交互学习算无监督学习,监督学习还是算增强学习?第一个人类,用视觉认知这个世界,开始沉淀知识,到现在的人类,已经有一个非常强大的知识库。我们可以直接获得这些知识,不断迭代,修正人类对世界的认知模型。看完这段话,结论还是两个字,“懵逼”。为了稍微不心慌一点,我们可以先从1+1=2开始从新认识这个世界。

神经元

一个神经元通常具有多个树突,主要用来接受输入的信息(Input);而轴突只有一条(Algorithm),轴突尾端有许多轴突末梢可以给其他多个神经元传递信息(Output)。轴突末梢跟其他神经元的树突产生连接(Connection),从而传递信号。举个例子,人类的眼睛可以收集视觉信息,然后刺激产生生物电磁脉冲把信息导向神经元的树突,最终输出眼睛看见的物体认知结果。

简化版

screenshot.png

详细版

819px-Complete_neuron_cell_diagram_zh.svg.png

神经网络

神经网络描述如下:

2256672-c6f640c11a06ac2e.png

上图中每个圆圈都是一个神经元(Neuron),每条线表示神经元之间的连接(Connection)。我们可以看到,上面的神经元被分成了多层(Layer),层与层之间的神经元有连接,而层内之间的神经元没有连接。最左边的层叫做输入层(Input Layer),这层负责接收输入数据;最右边的层叫输出层(Output Layer),我们可以从这层获取神经网络输出数据。输入层和输出层之间的层叫做隐藏层(Hidden Layer)。隐藏层大于2的叫深度神经网络,功能更强大。简单来说就是用深度换广度,但是需要更多的样本数据来训练。

感知器

感知器也叫单层神经网络(单个运算层),就是很简单的一种神经网络,1+1=2这种。感知器结构如图:

2256672-801d65e79bfc3162.png

概念模型:

  • 输入及权重:一个感知器可以接收多个输入,每个输入上有一个权值,此外还有一个偏置项bias=x0*w0
  • 加权求和(Weighted Sum)
  • 激活函数(Activator):上图里面是一个阶跃函数(Step Function)
  • 输出(Output)

训练时的数学模型(数学公式插件不好使啊):

  • 加权求和:

    • screenshot.png
  • 阶跃函数:

    • screenshot.png
  • 输出:

    • screenshot.png
  • 训练模型

    • 权重

      • screenshot.png
      • screenshot.png
    • 偏置项:

      • screenshot.png
      • screenshot.png
    • 学习速率:艾塔符号

核心代码(Python)

加权求和

reduce(lambda a, b: a + b,
                   map(lambda (x, w): x * w, zip(input_vecs, self.weights))
                   , 0.0) + self.bias

阶跃函数

def step_f(z):
    return 1 if z > 0 else 0

输出

self.activator(
            reduce(lambda a, b: a + b,
                   map(lambda (x, w): x * w, zip(input_vecs, self.weights))
                   , 0.0) + self.bias
        )

训练模型-权重

self.weights = map(lambda (x, w): w + rate * delta * x, zip(input_vec, self.weights))

训练模型-偏置项

self.bias += rate * delta

模拟布尔运算代码(AND、OR、XOR)

class Perceptron(object):
    def __init__(self, features_num, activator):
        self.features_num = features_num
        self.weights = [0.0 for i in range(features_num)]
        self.activator = activator
        self.bias = 0.0

    def __str__(self):
        return 'weights:%s \n bias:%s \n' % (self.weights, self.bias)

    def predict(self, input_vecs):
        return self.activator(
            reduce(lambda a, b: a + b,
                   map(lambda (x, w): x * w, zip(input_vecs, self.weights))
                   , 0.0) + self.bias
        )

    def train(self, input_vecs, labels, iteration, rate):
        for i in range(iteration):
            samples = zip(input_vecs, labels)
            for (input_vec, label) in samples:
                output = self.predict(input_vec)
                self.update_weights(input_vec, label, output, rate)

    def update_weights(self, input_vec, label, output, rate):
        delta = label - output
        self.weights = map(lambda (x, w): w + rate * delta * x, zip(input_vec, self.weights))
        self.bias += rate * delta


def step_f(z):
    return 1 if z > 0 else 0


def get_training_ds(operator):
    input_vecs = [[1, 0], [1, 1], [0, 0], [0, 1]]
    if operator == 'AND':
        labels = [0, 1, 0, 0]
    if operator == 'OR':
        labels = [1, 1, 0, 1]
    if operator == 'XOR':
        labels = [1, 0, 0, 1]
    return input_vecs, labels


if __name__ == '__main__':
    input_vecs, labels = get_training_ds('AND')
    and_perceptron = Perceptron(2, step_f)
    and_perceptron.train(input_vecs, labels, 5, 0.2)
    print and_perceptron
    print '0 and 1 -> %s \n' % and_perceptron.predict([0, 1])
    print '1 and 0 -> %s \n' % and_perceptron.predict([1, 0])
    print '1 and 1 -> %s \n' % and_perceptron.predict([1, 1])
    print '0 and 0 -> %s \n' % and_perceptron.predict([0, 0])

    input_vecs, labels = get_training_ds('OR')
    or_perceptron = Perceptron(2, step_f)
    or_perceptron.train(input_vecs, labels, 5, 0.2)
    print or_perceptron
    print '0 and 1 -> %s \n' % or_perceptron.predict([0, 1])
    print '1 and 0 -> %s \n' % or_perceptron.predict([1, 0])
    print '1 and 1 -> %s \n' % or_perceptron.predict([1, 1])
    print '0 and 0 -> %s \n' % or_perceptron.predict([0, 0])

    input_vecs, labels = get_training_ds('XOR')
    xor_perceptron = Perceptron(2, step_f)
    xor_perceptron.train(input_vecs, labels, 5, 0.1)
    print xor_perceptron
    print '0 and 1 -> %s \n' % xor_perceptron.predict([0, 1])
    print '1 and 0 -> %s \n' % xor_perceptron.predict([1, 0])
    print '1 and 1 -> %s \n' % xor_perceptron.predict([1, 1])
    print '0 and 0 -> %s \n' % xor_perceptron.predict([0, 0])

输出结果(XOR搞不定,因为单层神经网络只能搞定如下这种一条直线的分类):

screenshot.png

weights:[0.4, 0.2] 
 bias:-0.4 

0 and 1 -> 0 

1 and 0 -> 0 

1 and 1 -> 1 

0 and 0 -> 0 

weights:[0.2, 0.2] 
 bias:0.0 

0 and 1 -> 1 

1 and 0 -> 1 

1 and 1 -> 1 

0 and 0 -> 0 

weights:[-0.1, 0.0] 
 bias:0.1 

0 and 1 -> 1 

1 and 0 -> 0 

1 and 1 -> 0 

0 and 0 -> 1 

深度神经网络

神经元更多,2+Hidden Layers,激活函数(阶跃、Sigmoid、Tanh)

TensorFlow.png

目录
相关文章
IntelliJ IDEA - 在选中的范围内搜索关键字
IntelliJ IDEA - 在选中的范围内搜索关键字
1178 0
IntelliJ IDEA - 在选中的范围内搜索关键字
|
存储 缓存 算法
iOS 常见触发离屏渲染场景及优化方案总结
iOS 常见触发离屏渲染场景及优化方案总结
1174 0
iOS 常见触发离屏渲染场景及优化方案总结
|
9月前
|
存储 监控 数据可视化
常见的分布式定时任务调度框架
分布式定时任务调度框架用于在分布式系统中管理和调度定时任务,确保任务按预定时间和频率执行。其核心概念包括Job(任务)、Trigger(触发器)、Executor(执行器)和Scheduler(调度器)。这类框架应具备任务管理、任务监控、良好的可扩展性和高可用性等功能。常用的Java生态中的分布式任务调度框架有Quartz Scheduler、ElasticJob和XXL-JOB。
3088 66
|
3月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
3月前
|
缓存 Oracle Java
说一说无锁队列 Disruptor 原理解析
我是小假 期待与你的下一次相遇 ~
|
12月前
|
敏捷开发
敏捷开发:拥抱变化,快速迭代
在软件开发领域,敏捷开发已成为应对快速变化、提升交付效率的有效方法。它强调团队协作、客户反馈和灵活应变,核心价值观包括个体互动优先于流程工具、可工作软件优先于详尽文档、客户合作优先于合同谈判、响应变化优先于遵循计划。敏捷开发通过跨功能团队、短周期迭代、持续改进和客户紧密合作等实践,实现高效开发和创新。虽然面临抵抗变化、管理期望等挑战,但敏捷思维能显著提升团队表现和产品品质。
|
消息中间件 Kubernetes 监控
云原生日志采集管理方案--Fluent Operator
Fluent Operator是由KubeSphere 社区于2021年捐献给Fluent 社区的,最初是为了满足以云原生的方式管理 Fluent Bit 的需求。Fluentbit Operator可以灵活且方便地部署、配置及卸载 Fluent Bit 以及 Fluentd。同时, 还提供支持 Fluentd 以及 Fluent Bit 的插件,用户可以根据实际需求进行定制化配置。
1677 0
|
Oracle IDE Java
最详细的Android开发环境配置经验分享(包含配置过程中可能出现的问题及解决办法。繁琐的配置步骤是否是你头疼呢,详细配置步骤你值得拥有!)
最详细的Android开发环境配置经验分享(包含配置过程中可能出现的问题及解决办法。繁琐的配置步骤是否是你头疼呢,详细配置步骤你值得拥有!)
628 0
最详细的Android开发环境配置经验分享(包含配置过程中可能出现的问题及解决办法。繁琐的配置步骤是否是你头疼呢,详细配置步骤你值得拥有!)
|
运维 安全 测试技术
东软集团与阿里云携手助力企业上云,共建生态圈
在2022云栖大会上,东软集团凭借着领先的全球化信息技术、丰富的交付经验,与阿里云携手在Landing Zone项目上的合作共建,荣获阿里云2022「Landing Zone生态合作伙伴授牌认证」,未来双方将继续携手共进,共同构建繁荣的生态,帮助更多的客户上好云、管好云。
东软集团与阿里云携手助力企业上云,共建生态圈
|
缓存 API 开发者
API开放 | 国际包裹查询接口解决方案International Package Tracking 17TRACK
物流环节信息化升级,用户物流体验升级,国际包裹查询接口解决方案International Package Tracking 17TRACK接口使用教程。有100单免费测试额度,需要完整的技术开发文档v我837094255
API开放 | 国际包裹查询接口解决方案International Package Tracking 17TRACK