本文参考:https://juejin.cn/post/7084409806492008456
设代优化的模型参数为$\theta$,目标函数(损失函数)为$J(\theta)$,学习率为$\eta$,迭代周期为$t$,损失函数$J(\theta)$关于当前参数$\theta$的梯度为$g_t=\nabla_\theta J(\theta)$。
梯度下降(Gradient Descent)参数更新方法为:
\theta_{t+1}=\theta_t-\eta\cdot\nabla_\theta J(\theta)=\theta_t-\eta\cdot g_t该方法存在如下的一些缺点:
训练速度慢:在大规模数据集上进行训练时,每输入一个样本都要进行一次参数更新,而每次迭代都要遍历所有的样本。
容易陷入局部解:如果走到局部的洼地,可能会认为已经达到最低点。
批量梯度下降(Batch Gradient Descent)不像标准GD那样,对每个样本输入都进行参数更新,而是直接对所有数据的输入进行参数更新(相当于单独计算每个样本的梯度,然后将其求平均):
\theta_{t+1}=\th ...
转载自https://git-scm.com/book/zh/v2/Git-%e5%88%86%e6%94%af-%e5%88%86%e6%94%af%e7%ae%80%e4%bb%8b。
git分支简介 Git 保存的不是文件的变化或者差异,而是一系列不同时刻的 快照 。
在进行提交操作时,Git 会保存一个提交对象(commit object)。 知道了 Git 保存数据的方式,我们可以很自然的想到——该提交对象会包含一个指向暂存内容快照的指针。 但不仅仅是这样,该提交对象还包含了作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针。 首次提交产生的提交对象没有父对象,普通提交操作产生的提交对象有一个父对象, 而由多个分支合并产生的提交对象有多个父对象。
假设现在有一个工作目录,里面包含了三个将要被暂存和提交的文件。 暂存操作会为每一个文件计算校验和,然后会把当前版本的文件快照保存到 Git 仓库中 (Git 使用 blob 对象来保存它们【Blob(Binary Large Object)对象用于表示不可变的、原始数据的类文件对象。它可以存储二进制数据,通常用于处理文件或大 ...
转载自https://git-scm.com/book/zh/v2/Git-%e5%9f%ba%e7%a1%80-%e8%8e%b7%e5%8f%96-Git-%e4%bb%93%e5%ba%93。
获取git仓库有两种获取 Git 项目仓库的方式:
将尚未进行版本控制的本地目录转换为 Git 仓库;
从其它服务器 克隆 一个已存在的 Git 仓库。
在已存在目录中初始化仓库进入希望转化为git仓库的工作目录,执行
$ git init
该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。但是这只是一个简单的初始化,项目中的文件还没有被跟踪。
如果在一个已存在文件的文件夹(而非空文件夹)中进行版本控制,你应该开始追踪这些文件并进行初始提交。 可以通过 git add 命令来指定所需的文件来进行追踪,然后执行 git commit :
$ git add *.c %将所有的扩展名为.c的文件添加到暂存区
$ git add LICENSE
$ git commit -m 'initial project ...
转载自https://git-scm.com/book/zh/v2/%e8%b5%b7%e6%ad%a5-%e5%85%b3%e4%ba%8e%e7%89%88%e6%9c%ac%e6%8e%a7%e5%88%b6。
版本控制(VCS,version control system)本地版本控制比较流行的一种是RCS,在硬盘上保存补丁集,通过应用所有的补丁,可以重新计算出各个版本的文件内容。
集中化版本控制系统集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS)有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。这已经成为了版本控制的标准做法。
每个人都可以在一定程度上看到项目中的其他人正在做些什么。 而管理员也可以轻松掌控每个开发者的权限,并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易。
但是缺点在于,如果中央服务器出现损坏或者宕机,那么所有使用者在这段时间都无法工作甚至使其此前的所有版本记录。
分布式版本控制系统分布式版本控制系统 ...
本文参考莫烦python-强化学习。
基本概念一种对强化学习的直观理解就是通过不断地尝试,从实践中学习,最终找到某种规律,得到一个训练后的agent。从实践中学习需要一个老师,这个老师会根据agent的行为进行打分,agent的训练过程实际上就是记住了各种行为对应的打分。
监督学习中使用的数据是同时包含数据和正确标签的,而强化学习可以认为老师给行为打的分数就是某种标签。
强化学习分类model-free和model-based在model-free的方法中,都是直接从环境中得到反馈然后学习,比如Q Learning,Sarsa,Policy Gradients。而model-based则增加了一个程序,为真实世界增加了建模模型来进行模拟,这种方法可以模拟一些真实场景中不存在的情况,并且这种训练出来的RL模型具有一定想象力,可以预判接下来要发生的所有情况来进行行为选择。
基于概率和基于价值基于概率的模型可以通过感官分析下一步要采取的各种动作的概率,然后根据概率采取行动,比如Policy Gradients。而基于价值的模型则是会直接选择价值最高的动作,比如Q Learning,Sarsa ...
对多级缓存的认识多种miss:
cold miss
conflict miss
capacity miss
多种并行思路在本次课程中,除开上一次课程介绍的超标量(指令级别并行),又介绍了多种并行处理器思路来提升吞吐量(throughput),考虑到
并行执行
访问存储器的延迟(latency)
超标量(super scalar)对于同一个程序,可以同时抓取预先编译好的多个可并行指令进行执行。
程序中的并行是由硬件自动发现的。
多核处理器在还没出现多核处理器的时候,人们设计CPU往往致力于增加更多的模块来让单条指令执行地更快。
但是通过删去这些额外的模块,实际上可以实现多个核的处理器(单核的性能比原来要差)。
这样通过在程序中定义多个线程,就可以比较充分地利用两个核的性能。程序示意图如下所示:
现代多核处理器的例子:
单指令多数据流(SIMD)single instruction, multiple data。
通过引入更多的ALU(计算单元),使得可以在同一时间对多个数据进行相同的运算操作。
如上架构可以执行如下的数据并行程序:
【注意上述第二个程序既可以 ...
课程核心主题【课程前置:计算机组成相关课程】
设计并编写真的能够加速的并行程序并行思维:
将工作分解为多个块,使得这些块可以安全地并行执行
将每块工作分配给处理器
适当地规划不同处理器之间的交流和同步问题,保证这些问题不会限制加速比
对上述并行思维各项任务的抽象(架构):使用现有并行编程语言进行编程
并行计算机硬件的实现:并行计算机如何工作可以高效实现程序抽象的架构:
实现的性能特征
设计的trade-off:性能,便利,能耗
为什么需要了解硬件:
计算机的设计架构对于程序编写十分重要
效率和性能十分重要
关注效率快速并不意味着高效率!
使用一个具有10个处理器的计算机,但是仅仅实现了2倍的加速比,这显然是不行的。
基础概念程序电脑程序是一系列需要执行的指令。
指令指令是处理器需要处理的操作。执行指令实际上修改了电脑的状态,所谓状态就是指存储在电脑中的数据,这些数据处于寄存器或者存储器中。
指令级别并行instruction level parallelism(ILP):构建
寄存器-缓存-存储器多级结构
三个流派
行为主义:基于控制论,构建感知-动作型控制系统,类似于小脑(强化学习)
符号主义:基于符号逻辑的方法,用逻辑表示知识和求解方法
连接主义:基于大脑中神经元细胞连接的计算模型,用人工神经网络来拟合智能行为
tips:通过核心例子或观点将文章内容在introduction中串联起来,保证审稿人在前期就可以很快理解文章内容。
本文参考💻【Linux】Vim 入门笔记,仅供自己查阅使用
基本概念模式vim编辑器是一种多模态编辑器,其允许用户切换不同的模式来进行不同的编辑任务:
normal:最初始的模式,主要用于查询和移动
insert:i
replace:r
visual:v
visual line:shift-v
visual block:ctrl-v
command line::
buffer, window, tab每一个buffer对应一个文件,一个window可以显示一个buffer(多个window可以对应同一个buffer),每一个tab可以打开多个window。
基本操作执行命令:后输入命令
退出vim
:q或:quit:退出当前tab中所在window,直到最后一个window则退出tab
:q!:退出并丢弃已有操作
:wq:保存更改(write)并退出(quit)
ZZ:等价于:wq
保存文件
:w:保存更改
:w <filename>:将当前内容保存到新的文件中
[M]基本移动使用h、j、k、l而不是左下右上的方向键
[M]前进到第一行或最后一行
gg:前往第一行 ...
shell脚本在shell中,空格十分重要。
$ foo=bar %可以执行
$ foo = bar %无法执行
注意单引号和双引号的区别。
$ echo "Value is $foo" %$foo会转变为其对应的变量值
$ echo 'Value is $foo' %$foo不会转换
下面是一个bash脚本的例子mcd.sh(创建以第一个参数为名的文件夹并进入):
mcd() {
ppmkdir -p "$1"
ppcd "$1"
}
其中$0表示脚本自身的名字,$1到$9依次表示各个输入参数,$_是上一个指令的最后一个参数,$?可以获得上一个指令的错误代码,!!可以指代上一条指令。可以通过如下指令来加载新定义的函数:
$ source mcd.sh %脚本中包含的函数会在当前shell中加载
逻辑符号:
$ false || echo "Oops fail" %如果第一条指令出错,则执行第二条指令
$ true && echo "Things went well" %如果第一条指令正确,才会执行第二条指令
$ false ; echo "This will alwa ...