线性模型到神经网络

🚀 在初始神经网络那一节(链接如下:初始神经网络)的最后,我们通过加大考虑的天数使得我们最后得到的模型Loss最终停留在了0.32k,当我们在想让模型更加准确的时候,是做不到的,因为我们使用的是线性模型(liner model);接下去我们一起探索将如何进一步优化。
1)线性模型也许太过于简单
由于使用的函数都是线性的,所以我们不管怎么调节b和w,最后得到的都仅仅只是不同的线性模型,显然线性模型是不能满足要求的,因为通过2017-2020年数据可知,有些天数的观看人数并不是呈现一个简单的比例关系变化,所以线性模型也许太过于简单了。

模型过于简单从而导致准确率提不上来,这被称之为model bias ,所以需要一些跟加灵活的函数。就如下图所示的红色线所示,其变化趋势有的天数可能成正比,有的天数可能成反比,那我们该如何得到这种红色的函数呢?

其实,可以将红色的函数看成是constant + sum of blue curve,该如何理解怎么加的呢,如下图所示

- 0号线也就是constant
- 1号线拟合第一段
- 2号线拟合第二段
- 3号线拟合第三段
所以可以通过一系列的蓝色线相加来得到最后结果,即最后的红色curve,那又如何得到这些不同的蓝色线呢?这个问题后面讲到。 所以说按道理来说,对于任何一条线(piecewise liner curve)。我们都可以通过一系列的蓝色线条(blue curve)组合来得到,可是也许有人会说,那对于完全曲线类型的函数我们又该如何拟合呢?
只需要在这些曲线( beyond piecewise liner curve )上取点,通过两点的连线,也可以很好的拟合出来曲线。

2)如何去得到各种各样的蓝色线条

对于上图的蓝色函数我们都可以通过下面的函数(sigomid函数)来进行拟合得到,只要改变不同的b和w的只值,我们就可以得到不同的蓝色函数线条。

具体看下不同的b和w如何影响蓝色线的形状:
- 不同的
w,可以看出来改变的是其线条的坡度 - 不同的
b,是将线进行的平移 - 不同的
c,是改变了线条的范围大小

所以各种各样的蓝色线可以通过sigmoid函数拟合得到,而只需要将函数写成多个蓝色函数和的形式就可以得到一个比较灵活的函数,而不会像liner model一样看上去那么的不可靠。

在之前我们是使用前一天的直接预测下一天的线性模型进行预测,由于存在model bias ,所以现在改用跟加灵活的函数;
- 其中 x 1 x_1 x1是输入的特征,也就是前一天的观看量
- 其中 b i b_i bi c i c_i ci和 w i w_i wi都是未知参数,是改变
sigmoid函数的参数 - 其中将
i个sigmoid函数变换后的函数相加,因为我们也具体不知道对于拟合一个函数,需要几个蓝色函数相加合适 - 其中 b b b也是未知参数,用于调节整体的误差。

在这里我们再次将考虑前一天的变成考虑前三天的观看量,最开始使用线性模型是: y = b + ∑ j w j x j y=b+\sum\limits_{j}w_jx_j y=b+j∑wjxj,现在为了让这个线性模型变得更加灵活,将其加到sigmoid函数中去,就可以让最后拟合的结果变得十分灵活。

也许这样看这这个式子很抽象,我们可以一步一步来看看他是如何进行的,在进行之前我们还是需要重新回忆一下这个式子中的参数都是什么
- x j x_j xj是输入的特征,表示有j个特征被输入,也就是有前j天的观看数据被输入
- w i j w_{ij} wij为什是ij呢,其中i表示第i种蓝色曲线,即 w i j w_{ij} wij表示在第i种蓝色曲线下其这j种特征分别对应的权重值。
- b i b_i bi和 w i j w_{ij} wij都是未知参数,其真实目的是调节
sigmoid函数的形状 - b b b是整体函数的偏移量

对于三个特征的输入,首先来计算第一条被拟合的蓝色curve ,因该是先写出其线性表达式,将其放入sigmoid函数中,其就会具有灵活性而拟合出来所需要的蓝色曲线,先来写出其线性函数,即如下: r 1 = b 1 + w 1 1 x 1 + w 1 2 x 2 + w 1 3 x 3 r_1=b_1+w_11x_1+w_12x_2+w_13x_3 r1=b1+w11x1+w12x2+w13x3再将这个这个线性函数放入sigmoid函数得到第一个蓝色curve1,同样依次可以得到蓝色curve2,蓝色curve3。

也就是上图所说的 a 1 a 2 a 3 a_ 1a_2a_3 a1a2a3在分别乘上 c 1 c 2 c 3 c_ 1c_2c_3 c1c2c3在将这三条蓝色curve相加再加上 b b b就得到了最后的 y y y 。
其实上面的函数可以通过矩阵的方式如下表示出来 r = b + w x r=b+wx r=b+wx

再将r放入sigmoid函数,也就得到了使用矩阵表示的函数,如下所示。

同样的,我们现在仅仅是将函数的表达式给写了写了出来,函数中的未知参数同样需要求解出来。
3)求解参数
求解参数这里依然采用梯度下降的方法,为了求偏导和表示方便,统一将参数写成一个矩阵 θ \theta θ。

其梯度下降求解的过程一样,建立Loss函数,对其分别求偏导,梯度下降,就如下图所示,直到得到最优解。

4)batch和epoch
我们在计算Loss的时候,我们是尝试将所有已知的训练数据算一个损失,然后根据这个损失函数求偏导计算偏导值,然后根据偏导值,决定未知参数的更新方向;当开始使用batch和epoch的时候,不再计算整个训练数据集的损失,接着往下看他是怎么进行的。
对于一个完整的数据集,将其随机分成几个等大小的数据集简称一个batch,再计算Loss的时候,就只将一个batch中的损失求和,求偏导,更新参数;进行第二次参数更新的时候,就选择下一个batch,进行更新参数。每次使用一个batch更新一次参数称为一个updata。当看完所有batch的时候,称之为一个epoch。

5)神经网络和深度学习
在上面我们学习的过程中,其实我们已经创造了一个神经网络,其实1943年,心理学家Warren McCulloch和数理逻辑学家Walter Pitts在合作的《A logical calculus of the ideas immanent in nervous activity》论文中就给出了人工神经网络的概念及人工神经元的数学模型,从而开创了人工神经网络研究的时代。1949年,心理学家唐纳德·赫布在《The Organization of Behavior》论文中描述了神经元学习法则。所以神经网络并不是什么新鲜的事情,在1969年,人工智能之父 Minsky(和Seymour Papert)在《感知器》(Perceptrons)一书里给感知器判了“死刑”,这是一本非常严谨的专著,影响力很大。都得到一个简单的结论:神经网络都是骗人的。

神经网络网络这个名词在那个年代就好像一个臭明昭著的名词,谁也不感冒,所以为了发展它,取了另外一个名字,叫做深度学习(deep learing),即如下图所示,在结果输出的时候,在放一层神经元,使其深度变大。

在之后,我们的网络深度越来越深,其效果也是越来越好,如下图所示

所以我们也将我们的网络叠的深一点来看其表现,显然在网络在叠到三层的时候,表现非常好了,但是当网络叠到第四层的时候,其在训练集上的损失是0.1k,而在没有看过的数据上确表现的很差,这是由于层数太多导致了overfitting

随着网络深度的增加,会使得最后得到的结果更加准确,结果更加准确是函数拟合的更加贴切,深度增肌无非就是sigmoid的增加,那为什么非得在深度上拓展使之变得更深,而不是在宽度上拓展使其变的更宽呢?
相关文章:
线性模型到神经网络
🚀 在初始神经网络那一节(链接如下:初始神经网络)的最后,我们通过加大考虑的天数使得我们最后得到的模型Loss最终停留在了0.32k,当我们在想让模型更加准确的时候,是做不到的,因为我们…...
【架构】前台、中台、后台
文章目录 前台、中台、后台1. 前台(Frontend)特点:技术栈: 2. 中台(Middleware)特点:技术栈: 3. 后台(Backend)特点:技术栈: 示例场景…...
Stable Diffusion 蒙版:填充、原图、潜空间噪声(潜变量噪声)、潜空间数值零(潜变量数值零)
在Stable Diffusion中,蒙版是一个重要工具,它允许用户对图像的特定部分进行编辑或重绘。关于蒙版蒙住的内容处理选项,包括填充、原图、潜空间噪声(潜变量噪声)、浅空间数值零(潜变量数值零)&…...
ffmpeg录制视频功能
本文目录 1.环境配置2.ffmpeg编解码的主要逻辑:3. 捕获屏幕帧与写入输出文件4. 释放资源 在录制结束时,释放所有分配的资源。5.自定义I/O上下文6.对于ACC编码器注意事项 1.环境配置 下载并安装FFmpeg库 在Windows上 从FFmpeg官方网站下载预编译的FFmpeg…...
【LeetCode】每日一题 2024_10_1 最低票价(记忆化搜索/DP)
前言 每天和你一起刷 LeetCode 每日一题~ 大家国庆节快乐呀~ LeetCode 启动! 题目:最低票价 代码与解题思路 今天这道题是经典动态规划,我们定义 dfs(i) 表示从第 1 天到 第 i 天的最小花费,然后使用祖传的:从记忆…...
[C++] 小游戏 征伐 SLG DNF 0.0.1 版本 zty出品
目录 先赞后看 养成习惯 War and Expedition SLG DNF 0.0.1 version 讲人话就是 图标解释: 绿色代表空地,可通过,对应数值 0 蓝色“~ ”为水,不可通过,对应数值 1 棕色“”为桥梁,可通过࿰…...
黑马头条day7-app端文章搜索
今天的内容也只是跑了一下 对于具体的实现掌握的很差 仔细看 es 在微服务学的es使用基本忘光了 这里用起来一点都熟悉 重学!!! kafka异步 文章自动构建索引的时候用到了‘’ mongoDB 用来存储用户的搜索记录 遗忘(拦截器 j…...
嵌入式必懂微控制器选型:STM32、ESP32、AVR与PIC的比较分析
目录 1 微控制器基础概述 1.1 微控制器基本概念 1.2 工作原理及架构 1.3 STM32、ESP32、AVR和PIC简介 2 微控制器性能比较分析 2.1 性能比较 2.2 功耗比较 2.3 功耗分析 2.4 外设接口对比 3 应用场景与选择策略 3.1 物联网应用场景 3.2 工业控制场景 3.3 智能家居场…...
Python selenium库学习使用实操二
系列文章目录 Python selenium库学习使用实操 文章目录 系列文章目录前言一、模拟登录二、表单录入 前言 在上一篇文章中,我们完成Selenium环境的搭建,和简单的自动化。今天继续深入学习。今天的目标是完成模拟登录,和表单录入。 一、模拟登…...
基于Hive和Hadoop的电信流量分析系统
本项目是一个基于大数据技术的电信流量分析系统,旨在为用户提供全面的通信数据和深入的流量使用分析。系统采用 Hadoop 平台进行大规模数据存储和处理,利用 MapReduce 进行数据分析和处理,通过 Sqoop 实现数据的导入导出,以 Spark…...
访问docker容器中服务的接口,报错提示net::ERR_CONNECTION_REFUSED
背景 使用httpclient和前端调用docker容器中部署的springboot服务接口,一直连接不上。 报错信息 AxiosError {message: Network Error, name: AxiosError, code: ERR_NETWORK, config: {…}, request: XMLHttpRequest, …} sys.ts:28 POST http://172.33.28.179:8181/sy…...
【mysql相关总结】
mysql相关总结 数据库小的表,全表扫描效率更高,不用建索引。 索引的类型 1.普通索引:基本的索引,没有任何约束限制 2.唯一索引:类似普通索引,有唯一约束性 3.主键索引:特殊的唯一索引,不允许有空值 4.组合索引…...
uniapp 微信小程序 微信支付
本章的内容我尽量描述的细致一些,哪里看不懂给我评论就可以,我看到进行回复 微信支付大致分为4步,具体看后端设计 1. 获取code 2. 根据code获取openid 3. 根据openid,以及部分订单相关数据,生成prepayId (预支付交易会…...
CSS 效果:实现动态展示双箭头
最近写了一段 CSS 样式,虽然不难,但实现过程比较繁琐。这个效果结合了两个箭头,一个突出,一个内缩,非常适合用于步骤导航或选项卡切换等场景。样式不仅仅是静态的,还可以通过点击 click 或者 hover 事件&am…...
Linux 创建开发用的账户
在Linux系统中,创建一个用于开发的用户账户通常涉及到添加用户、设置密码以及配置适当的权限和环境。这里将详细介绍如何在Linux系统中创建一个新的开发用户账户,包括为其配置sudo权限,使其能够执行需要管理员权限的命令。 步骤 1: 创建用户…...
检查一个CentOS服务器的配置的常用命令
在CentOS系统中,查看服务器配置的常用命令非常丰富,这些命令可以帮助用户快速了解服务器的硬件信息、系统状态以及网络配置等。以下是一些常用的命令及其简要说明: 1. 查看CPU信息 (1) cat /proc/cpuinfo:显示CPU的详细信息&…...
Redis 简单的消息队列
使用redis 进行简单的队列很容易,不需要使用较为复杂的MQ队列,直接使用redis 进行,不过唯一不足的需要自己构造生产者消费者,这里使用while True的方法进行消费者操作 目录 介绍数据类型StringHash 重要命令消息队列 介绍 key-v…...
C++:继承和多态,自定义封装栈,队列
1.栈: stack.cpp #include "stack.h"Stack::Stack():top(nullptr),len(0){} //析构函数 Stack::~Stack() {while(!empty()){pop();} }bool Stack::empty() //判断栈是否为空 {return topnullptr; }int Stack::size()//获取栈的大小 {return len; } //压…...
Python多个set中的交集
Python多个set中的交集 在 Python 中,集合(set)是一种非常有用的数据结构,它可以存储唯一的元素,并提供了高效的数学集合操作,包括求交集、并集和差集等。本文将重点介绍如何通过多重集合求交集࿰…...
百度百科 X-Bk-Token 算法还原
声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请私信我立即删除! 文章目录 声明案例地址参数分析X-Bk-Token算法追踪X-Bk-Token后缀算法还原c 值跟踪与算法还原往期逆向文章推荐最近太忙了,博客摆烂了好…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
