精华内容
下载资源
问答
  • 人脸鉴别——即通常所说的人脸识别,核心是选择适当的人脸表示方式匹配策略。 4)   表情分析——即对待识别人脸地表情进行分析,并对其加以分类。 5)   物理分类—— 首先是人脸检测定位。受到...

    优势: 人脸识别系统更加直接,友好,使用者无心理障碍,并且通过人脸的表情/姿态分析,还能获得其他识别系统难以得到的一些信息

    人脸识别的研究内容:

    人脸识别一般可描述为:给定一静止或动态图像,利用已有的人脸数据库来确认图像中的一个或多个人。从广义上来讲:研究内容包括以下五个方面:

    1)  人脸检测

    2)  人脸表征——即确定表示检测出的人脸和数据库中的已知人脸的描述方式。通常的表示方法有几何特征(如欧氏距离,曲率,角度等)、代数特征(如矩阵特征矢量)、固定特征模板、特征脸、云纹图等。

    3)  人脸鉴别——即通常所说的人脸识别,核心是选择适当的人脸表示方式与匹配策略。

    4)  表情分析——即对待识别人脸地表情进行分析,并对其加以分类。

    5)  物理分类——

    首先是人脸检测与定位。受到以下因素的影响:1)人脸在图像中的位置、旋转角度和尺度不固定;2)发型和化妆会遮盖某些特征;3)图像中出现的噪声。

    其次是特征提取。一般做预处理如几何归一化和灰度归一化。

    最后是人脸识别。

    在用静态图像或视频图像做人脸识别的领域中,国际上形成了以下几类主要的人脸识别方法:

    1)基于几何特征的人脸识别方法,主要代表是MITBrunelliPoggio小组,他们采用改进的积分投影法提取出用欧氏距离表征的35维人脸特征矢量用于模式分类;

    2)基于模板匹配的 人脸识别方法,主要代表是Harvard大学Smith-Kettlewell研究中心的Yuille,采用弹性模板来提取眼睛和嘴巴的轮廓,

    3)基于K-L变换的特征脸方法,MIT媒体实验室的Pentland小组,在此基础上出现了各种改进方法,如Yale大学的belhumeur提出的Fisher脸方法;

    4)隐马尔科夫模型方法,主要代表有Cambridge大学的Samaria小组和Georgia 技术研究所的Nefian小组;

    5)神经网络识别方法,如Poggio小组提出的HyperBF神经网络识别方法,英国Sussex大学的BuxtonHowell小组提出的RBF网络识别方法等。

    6)基于动态链接结构的弹性图匹配方法,主要研究者是由CVon der Malsburg领导的德国Bochum大学和美国SouthernCalifornia大学的联合小组

    7)利用运动和颜色信息对动态图像序列进行人脸识别方法,主要代表是Queen MaryWestfield大学的ShaogangGong小组。

     

    主要应用:

    1)  刑侦破案

    2)  证件验证

    3)  入口检查

    4)  视频监控

     

    实际产品: 

    公司

    创建人

    产品名称

    时间

    备注

    Mirio

    Michael Kuperst

    1)TrueFace Cyber Watch

    2TrueFace Gate Watch

     

    1)  第一套用于计算机、网络和数据安全保障的软件

    2)  专用的入口控制系统

    Plettac

     

    Face VACS

    1998

    入口控制,可用于ATM,或计算机口令

    FaceKey

     

    FaceKey

     

    与指纹识别结合,使错误接收率为百万分之一

    Visionics

     

    FaceIt

    1994

    PCA-〉局部特征分析

    Zn Bochum Gmbh

     

    1)      Zn-Face

    2)      ZN-Phantomas

    3)      Zn-SmartEye

     

    1)      入口控制

    2)      人脸搜索

    3)      视频监控

    Viisage

     

    1)  FaceFinder

    2)  FaceTools

    3)  FaceNet

    4)  FacePin

    基于特征脸方法

     

     

     

     

     

     

    其他还有FaceWarePassFaceEyematicBioID

     

    第三章:

    根据输入图像的性质,人脸识别方法分为静止图像的识别和图像序列的识别两大类。

    输入的静止图像分为侧面和正面两个方面

     

    人脸侧影识别

      90年以前使用

    使用立方B样条函数

    识别步骤:1。图像获取  2.特征提取  3。识别

     

    基于几何特征的人脸识别方法

    基本原理:人脸特征的整个几何结构足够用于识别。

    识别归结为特征矢量之间的匹配。基于欧氏距离的判决是最常用的方法。

    识别步骤:

    1.  归一化  一种获得尺度和旋转补变性的方法是设定两眼之间的距离和方向轴。

    首先基于模板匹配,

    2.  特征提取

    积分投影法: 图像I[x,y]在举行窗口[x1,x2]*[y1,y2]上的垂直积分投影定义为

                          V(x) =      H(y) =   

    一旦眼睛用模板匹配定位了,其他特征的搜索就可利用人脸五官分布的先验知识。

    最后一共可抽取35个几何特征用于识别。

    3.  识别   35维的特征向量表示,用贝叶斯分类器进行识别。假设每个人的特征向量服从高斯分布,因此不同的人仅均值有所不同。为了估计高斯分布的形状,用学习集的所有样本估计协方差矩阵:                          =   

    优点:1)符合人类识别人脸的机理,易于理解,识别率高2)对每幅图像只需存储一个特征矢量,存储量小;3)对光照变化不太敏感;4)特征提取工作只依赖于本幅图像,可用于只有单个样本的识别

    缺点:1)抽取稳定的特征比较困难,2)对强烈的表情变化或姿态变化的鲁棒性较差;3)特征点只能从灰度变化剧烈的地方抽取,因此不宜考虑人脸的三维结构;4)一般几何特征之描述了部件的基本形状与结构关系,忽略了局部细微特征,

     

    33 基于模板匹配的人脸识别方法

           大多是用归一化互相关,直接计算两幅图像之间的匹配程度。预处理要做尺度归一和灰度归一的工作。

           弹性模板由一组根据特征形状的先验知识设计的可调参数所定义。为了求出这组参数,需要利用图像的边缘、峰值、谷值和强度信息及特征形状的先验知识设计合适的能量函数。

     

    人脸轮廓的椭圆模型

    眼睛模板

    Yuille 提出的眼睛模版。采用最速下降法最小化能量,依次寻找眼睛的各重要特征点,

     

    嘴唇模版 分为闭模板和开模板

     

    3.4 等灰度线 

           基本原理:灰度图象中具有相同灰度值区域的边界。

           识别步骤:

    1.  预处理 分为5步进行:1)取人脸轮廓边缘,可采用Sobel算子S02)消除边缘噪声 3)连接边缘轮廓上的小间隙,反复使用扩张和收缩操作, 4)剪出图像中的人脸区域,5)平滑轮廓线及归一化人脸区域

     

    2.  提取等灰度线  作出直方图,把直方图分为8个区域,每个区域的大小可有所不同,

     

    第四章 现代人脸识别方法

     

    4.1 特征脸方法

    特征脸方法是从主成分分析(PCA)导出的一种人脸识别和描述技术。

    识别过程就是将人脸图像映射到由特征脸张成的字空间上,比较其与已知人脸在特征脸空间中的位置,具体步骤如下:

      1)初始化   2)输入新的人脸图像,将其映射到特征脸空间,得到一组权值。 3)判断是否为人脸。 4)若是人脸,判断是数据库中的哪个人 5)学习

    特征脸的优点: 1)图像的原始灰度数据直接用来学习和识别,不需要任何低级或中级处理 2)不需要人脸的几何和反射知识  3)通过低维子空间表示对数据进行压缩 4)简单有效。

      它依赖于训练集和测试集图像的灰度相关性,而且要求测试图像与训练集比较像,有很大的局限性:  1)对尺度变化很敏感 2)只能处理正面人脸图像,在姿态、发型和光照等发生变化时识别率明显下降  3)要求背景单一  4)学习时间长,只能离线计算

     

    改进: 双子空间法,相形歧义分析方法,Fisher脸方法。

     Fisher 脸方法又称为线性判别分析(LDA)方法,它选择与类内散布正交的矢量作为特征脸空间,从而能压制图像之间的与识别信息无关的差异,对光照及人脸表情变化都不太敏感。

    K-L变换的思想比较相近但不是从统计角度出发的另一种变换是奇异值分解(SVD)方法,即将图像矩阵的奇异值作为模式的特征矢量。同时拥有代数与几何两方面的不变性,即对图像灰度值的比例变化、平移、旋转和伸缩具有不变性。

    奇异值分解的论文

     

     

     

     

    双子空间法   Peng H Zhang D Dual eigenspace method for human face recognition  Electronics Letters 1997 33(4) 283-284

    相形歧义分析方法

     

    Fisher脸方法

     

      4.2 隐马尔可夫模型

      论文:

    HMM有三个主要问题:评估、估计及解码。 评估用于解决识别问题,一般采取比较有效的“向前—向后”法;  估计问题用来产生用于识别的各个单元的HMM,采取 Baum-Welch方法。 Viterbi算法用以求取给定观测序列的最佳状态序列。

    1.  HMM的表示  主要由以下元素组成:1)模型中的状态总数N  2)初始状态分布 Π  3)状态转移概率矩阵A,即A={aij 4) 状态概率矩阵B

    2.  前向—后向算法

    3.  Baum-Welch算法

    4.  Viterbi算法  以最大值取代包括最大值之内的所有可能项之和。是计算得分的近似方法。

     

    4.3        基于神经网络的方法

    有其特殊的优势,不需要一套由人确定的规则,同时避免了复杂的特征提取工作,能根据有代表性的样本自我学习,具有鲁棒性和自适应性。

    论文

     

    用神经网络进行人脸识别主要有以下三种结构:

    1)  为所有已知人脸建立一个神经网络 

    2)  为每一个人脸建立一个神经网络

    3)  为每一对人脸建立一个神经网络

    多层感知器(MLP 

       模型特点:MLP是一个多层前馈神经网络,由输入层、一个或多个隐层以及一个输出层组成。采用BP算法。

    RBF网络

      模型描述 :RBF网络可视为由一个隐层所构成的前馈神经网络,其隐节点输出是p维输入特征矢量X与特征空间中的固定点Ci=(..) 

    HyperBF 网络

    其他的神经网络模型

     

    4.4        弹性图匹配方法

    一种基于动态链接结构的方法,它将人脸用格状的稀疏图表示,图中的节点用图像位置的Gabor小波分解得到的特征向量标记(称为jet),图的边用连接节点的距离向量标记。匹配过程如下:首先寻找与输入图像最相似的模型图,在对图中的每个节点位置进行最佳匹配,这样产生一个变形的图,其节点逼近模型图的对应点的位置。

    弹性图匹配方法对光照、位移、旋转及尺度变化都不敏感,是一种优于特征脸的人脸识别方法。

    相关论文:

    主要缺点是对每个存储的人脸需计算其模型图,因此计算复杂,存储量大,利用聚束图匹配就可部分克服这个缺点。有关聚束图的论文如下

    Gabor小波预处理 Gabor小波是以任意一个高斯函数作为窗函数的窗口Fourier变换。一个图像像素与不同方向和频率的Gabor核卷积后的系数集合称为一个jet

     

    人脸表示:

    1.  个人人脸  2。人脸聚束图  

     

    弹性聚束图匹配产生人脸表征 

    手动定义,产生系统的初始图。每种姿态一个图,并且产生不同姿态图的对应节点的指针一旦有了一个聚束图,新输入图像的聚束图就可通过弹性聚束图匹配得到。

       1.手动定义图  2 图的相似性函数 

    3。匹配过程  从粗到细:第一步,寻找人脸的近似位置; 第二步,精化人脸位置和大小。第三步,精化尺寸和寻找纵横比; 第四步, 局部变形

     

    识别:

     

    4.5        其他人脸识别方法

     

    Jia Nixon 指出:单靠扩展单一种类的特征数目是不够的,而要扩展与原特征集正交的其他种类特征,他们采用的扩展特征矢量有四种特征集:正面人脸的几何特征、侧面轮廓特征、眼睛形状特征以及人脸轮廓特征。  其中侧面轮廓特征是从正面人脸图像中获得的,方法是Walsh变换描述人脸对称轴处局部灰度值得水平积分投影曲线。论文有

    目前研究最多的识别方法基本上都是针对二维灰度图象的,除此之外,还有深度人脸图像数据

    Curva-ture. Proce4edings of SPIE 1991 Vol.1570 ,pp 234-247

    和红外人脸图像数据

     

    另外,可以使用多CCD摄像机系统,得到三维信息模型,论文如下:

     Recognition Killington 1996

    利用多种生物特征,如把人脸识别与指纹识别结合,或者与语音识别结合

     

     

    第五章 图像序列中的人脸识别方法

    论文

    图像序列与静止图像的人脸识别相比,优势如下:

    1)  图像序列提供了多帧人脸图像,因此可以从中选择质量较好的几帧图像进行分类识别。

    2)  图像序列具有时间连续性,

    3)  可以补偿人脸的表情和姿态的变化。

    困难如下:

    1)  质量一般都较低

    2)  尺寸较小

     

    图像序列中的人脸识别系统一般包括3个模块:人脸检测、人脸跟踪和人脸识别模块。  检测和分割人脸大多利用视频流里的人脸的运动信息来分割人脸。论文:

    人脸跟踪算法,主要 分为基于运动的跟踪方法和基于模型的跟踪方法。论文

    两种思路:

    1)  利用对整个头部进行跟踪,利用头部形状特征(近似椭圆)对其进行跟踪。

    2)  对脸部重要器官的特征跟踪

    同上 3261

    跟踪的同时需要对运动进行预测。广泛采用的是Kalman滤波

    人脸姿态的估计

     Recognitioin Killington 1996

    处理人脸深度旋转主要有三种方法

    图像序列中的人脸识别方法主要有2种方案:一种是从图像序列中选择几帧质量较好的图像,然后用静止图像的人脸识别方法进行匹配,大多数系统都采用这种方法进行识别。第二种是对所有跟踪帧应用计算方法识别,不断调整识别概率。

    5.2 基于运动和颜色的人脸识别方法

    Springer 1998

    5.2.1 运动目标检测

    利用运动序列中每帧的像素与时间滤波卷积可检测运动轮廓:

    5.2.2          人脸肤色模型

    不同人之间的差异主要存在于亮度而不是在色彩上。可以用于人脸检测的粗定位环节。论文如下:

    Recognitioin Killington 1996

    5.2.3          人脸检测

    5.2.4          人脸跟踪

    5.2.5          人脸识别

     

    首先在较高级分辨率图像上配准人脸,再将人脸图像用人脸空间中的一组向量表示,人脸空间由PCA或线性判别分析(Linear Discriminant AnalysisLDA)得到。识别就可用最近邻方法在人脸空间上匹配人脸。

     

    从图像序列中判断人脸可以用高斯概率分布来做,从一系列的人脸图像中匹配,看哪个人的概率比较高,

    第六章 人脸是别系统的评价

     

    人脸识别系统评价必须注意以下几点:1)必须有足够用于评价的大量测试样本;2)样本图像应与实际应用中出现的图像尽可能相似,而且要有代表性;3)除了讨论系统的错误接受率外,还应该考虑系统的错误拒绝率。

    评价人脸识别系统的标准,

    1)  系统识别率 = 100% - 错误接受率 错误拒绝率

    2)  对样本的约束

    3)  速度和硬件要求

    4)  人机界面 

    5)  其他: 系统识别人数,系统地学习能力以及处理噪声的能力

    论文

     

    62 人脸数据库

           1.英国ORLOlivetti Research Laboratory 使用最广泛的人脸数据库     2。英国Manchester 人脸数据库  3。美国 FERET(FacE Recognition Technology) 最大的人脸数据库  4。日本ATR数据库  5。欧洲 M2VTS多模型人脸数据库

    6.3  系统可靠性检验

    错误拒绝率——在数据库中的人脸被错误拒绝FRR

    错误接受率——不在数据库中的人脸被错误接受 FAR

    必须选择合适的阈值, 使得FRRFAR 取得一个折中。

     

    第七章 总结与展望

    应用最广泛的一种全局特征描述方法是基于K-L变换的特征脸方法,局部特征描述则需用到人脸器官形状和分布的先验知识。 人脸识别与其他生物统计学鉴别系统如指纹识别、语音识别等相结合,能提供很高的正确识别率,可用于安全性能要求较高的系统。

    图像序列中利用整个跟踪序列来识别人脸的关键是进行运动估计和人脸跟踪。

    人脸识别的一个重要步骤是系统评价,必须选择标准数据库和足够多的测试样本,而且要同时考虑系统地错误接受率和错误拒绝率。

    自动识别人脸系统最大两个问题是如何处理光照变化和姿态变化的影响。

    目前需要解决的3个主要技术是:

    1)人脸检测与定位

    2)特征选择与提取  人脸是塑性变形体,更适合用弹性模型来描述。

    3)人脸识别  将多种方法有效综合将是以后研究的一个趋势。另外可以与基于其他生物特征的鉴别系统结合以提高识别率。

     

     

     

    展开全文
  • 四年测试工程师经历,下一步转开发还是继续测试? 测试四年,没有积累编程脚本能力和自动化经验,找工作时都要求语言能力,自动化框架。 感觉开发同事积累的经历容易找工作下一步,想办法转开发岗还是继续测试...

    四年测试工程师经历,下一步转开发还是继续测试?

    测试四年,没有积累编程脚本能力和自动化经验,找工作时都要求语言能力,自动化框架。

    感觉开发同事积累的经历容易找工作。

    下一步,想办法转开发岗还是继续测试???

     

     

    [我的回答]2018年8月18日


    题主的问题,总共有3句话组成,我的回答基本上按照你的描述开展,只是顺序换一下。假如是面对面的方式,那么通过不断的问答模式,可以更快地找到根本原因,并提供更合理的分析与建议。本文只能根据我的一些经验和猜测而展开。

     

    描述3:“下一步,想办法转开发岗位还是继续测试?”

    针对这个问题,想问题主一个问题:你为什么想要转到开发岗位?粗略地想,题主应该主要有两个原因:真心喜欢开发而不喜欢测试工作、因为开发工作收入更高。

     

    1)原因1:题主真心喜欢开发而不喜欢测试工作

    这里的喜欢指的是来自于动机培养中的一流动机:因为自己喜欢并且开发工作能够带来内心的乐趣和成就感。假如是因为感觉开发工作收入更高,那是伪喜欢,把它放在原因2中。因此本小节后续的内容围绕题主的一流动机 - 喜欢开发工作。

     

    假如是这个原因,回答题主的问题就明确了:必须是想办法转到开发岗位。接下来要考虑的更重要问题是:如何提升你的能力满足开发岗位的要求,才是题主需要考虑的,即纠结应该转到开发岗位还是测试工作没有意义,关注点在于题主的能力提升以满足开发岗位的要求!

     

    以前在我的博客中写过一篇文章“规划测试人员的测试职业发展路径”,其中的实施步骤同样适用于开发岗位,简单讲可以通过O2EP步骤达到目标(详细内容可以参考博客中对应的文章):

    1. 明确目标O:例如2年内题主计划转到开发岗位;

    2. 理清障碍O:当前存在的主要障碍是什么?例如:开发语言不懂、数据库不懂等;

    3. 选择榜样E:开发团队中,有谁做得很好?你与他之间的差距主要表现在哪里?这些差距就是你在2年时间内需要弥补的;

    4. 行动计划P:针对障碍和差距,制订计划进行弥补和完善;

     

    O2EP步骤中第四步“行动计划P”对于每个人而言都是最难的:难的不在于三分钟热度的开始,而在于长时间的坚持!

     

    2)原因2:感觉开发工作收入更高

    这就有点类似于目前行业内争议很大的“软件测试没有前途”、“软件测试没有技术含量”的议题。我们需要问的一个问题是“为什么开发工作收入会更高?”,通过连续问几个“为什么”(5WHY法找到根本原因),你会发现开发工作收入更高的背后原因,很多时候不在开发工作本身,而更多的在于人与人之间的能力差距上。至少,相比于20年的开发和测试工作的收入差距,当前在同一个级别职位的开发和测试岗位,收入待遇差距并没有这么大。

     

    所以,对于测试工作经验4年的你,假如你的工资收入相比类似级别的开发人员,甚至优秀测试人员相差不少,就要从自身能力上面找原因了。在我的文章“规划测试人员的测试职业发展路径”中与提到了一个观点:开出租车同样可以有前途。尽管每个行业、每个岗位理论上都有个天花板(包括收入和职位),但对于个人而言,要问自己的是自己是否属于当前级别中前20%的位置,即金字塔的顶端位置。假如还不是,那么考虑转开发就意义不大,因为您还有空间继续增加你的收入,关键又在于你的能力是否能够不断提升!

     

    描述2:“感觉开发同事积累的经历容易找工作”

    根据问题中的描述,这句话的重点不是“开发的同事”,而是他“积累的经历或经验”,让他更容易找到工作。问题又回到了前面提到的,找工作的难以程度,开发还是测试角色不是决定性的因素,而是你在这4年的工作中经验积累,包括:

    1. 领域知识:做好测试工作的基础是你需要深入了解软件产品的行业背景知识,即领域知识。例如我以前是做通讯产品的,那么了解TCP/IP等知识是必须的。而你的测试对象又不是孤立的一个产品,它一定需要和周围很多不同软件产品共同集成为一个更大的系统,因此外围产品的知识你是否也需要去了解?

    2. 测试过程:测试不再仅仅关注在测试执行上,我们将测试贯穿于整个软件开发生命周期。因此,你需要知道在整个生命周期内需要做哪些事情,和开发团队等的关系是什么?举个例子:与定义需求的团队的关系是什么?输入输出之间的依赖关系?与项目管理团队的关系?输入输出之间的依赖关系等;就算是测试执行工作,它也不是孤立的,它是整个软件开发生命周期内的组成部分,它必定和周围的所有相关开发活动相关;

    3. 测试技术:测试过程中的每个活动,都需要有适合的测试技术支持,从而可以更好的提高测试效率和测试有效性。例如:测试分析与设计,你就需要选择合适的测试分析技术和测试设计技术;制订测试计划,你必定需要测试估算技术和测试风险技术等的支持;

    4. 测试管理:测试过程中的每个测试活动都是相互依赖和反馈的,因此对整个测试过程的管理和监控就是必须的,包括收集和分析每个活动的测试数据,并基于分析结果与计划目标进行比较,假如出现大的偏差,必须要采取合适的应对措施活动,以保证测试过程符合计划中的目标要求。

    5. 人:前面提到的4个维度,最终一定要落实到人身上,即所有的事情都需要测试人员去完成。此时,每个测试人员除了要具备前面的能力之外,还需要具备其他能力,例如:学习能力、思维能力、沟通能力、解决问题能力、时间管理、动机、性格和价值观等,都会影响你的测试工作。

     

    仅仅强调测试工作经验4年用处不大,而是要呈现你积累的经验、能力的不断成长,例如:你测试工作4年,实际的经验和能力说不定超越了一些工作8年的测试人员。最怕的是测试工作4年,只是把同样的测试工作重复做了4年。

     

    描述1:“没有积累编程脚本能力和自动化经验”

    既然知道找工作时要求编程语言能力和自动化能力,而工作了4年没有任何经验。同样的,这和你是开发角色还是测试角色没有关系。还是需要问自己为什么?找到该问题的根本原因,并静下心来逐步弥补这些方面的不足,比纠结转开发还是继续测试更重要。

     

    针对题主提的问题,归纳一下:你是否发自内心喜欢开发工作?还是因为感觉开发工作可以钱更多?做测试工作4年,收入是否已经是同类测试经历中属于前20%的范围?找工作难是因为测试这个角色导致的,还是因为个人能力不足引起的?

     

    最后,不管是什么工作或职位,决定因素在于你的技能和能力。当你的技能和能力在同类人群中已经属于上乘时,你会发现很多时候已经不需要你去选择什么样的工作或职位,而是人家开始追着你!

     

     

    希望,我这个回答能给大家一点思考的思路和方向!

    展开全文
  • 如何从RNN起步,一步一步通俗理解LSTM

    万次阅读 多人点赞 2019-05-06 23:47:54
    如何从RNN起步,一步一步通俗理解LSTM 前言 提到LSTM,之前学过的同学可能最先想到的是ChristopherOlah的博文《理解LSTM网络》,这篇文章确实厉害,网上流传也相当之广,而且当你看过了网上很多关于LSTM的文章...

                                 如何从RNN起步,一步一步通俗理解LSTM

     

     

    前言

    提到LSTM,之前学过的同学可能最先想到的是ChristopherOlah的博文《理解LSTM网络》,这篇文章确实厉害,网上流传也相当之广,而且当你看过了网上很多关于LSTM的文章之后,你会发现这篇文章确实经典。不过呢,如果你是第一次看LSTM,则原文可能会给你带来不少障碍:

    一者,一上来就干LSTM,不少读者可能还没理解好RNN。基于此,我们可以从最简单的单层网络开始学起;
    二者,原文没有对LSTM的三个门解释的足够细致,包括三个不同的sigmoid函数用的同一个符号σ(有错么?没错,看多了就会明白这是习惯用法);
    三者,不同的权值也用的同一个符号w,而当把图、公式、关系一一对应清楚后,初学就不会一脸懵逼了。甚至我们把各个式子的计算过程用有方向的水流表示出来,则会好懂不少,这个时候就可以上动图。

    而我自己就是这么经历过来的,虽然学过了不少模型/算法,但此前对LSTM依然很多不懂,包括一开始反复看ChristopherOlah博文《理解LSTM网络》,好在和我司AI Lab陈博士反复讨论之后,终于通了!

    侧面说明,当一个人冥思苦想想不通时,十之八九是因为看的资料不够通俗,如果还是不行,则问人,结果可能瞬间领悟,这便是教育的意义,也是我们做七月在线的巨大价值。

    众所周知,我们已经把SVM、CNN、xgboost、LSTM等很多技术,写的/讲的国内最通俗易懂了,接下来,我们要把BERT等技术也写的/讲的国内最通俗易懂,成为入门标准,而且不单单是从NNLM \rightarrow Word2Vec \rightarrow Seq2Seq \rightarrow Seq2Seq with Attention \rightarrow Transformer \rightarrow Elmo \rightarrow GPT \rightarrow BERT,我们希望给所有AI初学者铺路:一步一个台阶,而不是出现理解断层。

    本文在ChristopherOlah的博文及@Not_GOD 翻译的译文等文末参考文献的基础上做了大量便于理解的说明/注解(这些说明/注解是在其他文章里不轻易看到的),一切为更好懂。

     

    一、RNN

    1.1 从单层网络到经典的RNN结构
    在学习LSTM之前,得先学习RNN,而在学习RNN之前,首先要了解一下最基本的单层网络,它的结构如下图所示:

    输入是x,经过变换Wx+b和激活函数f,得到输出y。相信大家对这个已经非常熟悉了。

    在实际应用中,我们还会遇到很多序列形的数据:


    如:

    1. 自然语言处理问题。x1可以看做是第一个单词,x2可以看做是第二个单词,依次类推。
    2. 语音处理。此时,x1、x2、x3……是每帧的声音信号。
    3. 时间序列问题。例如每天的股票价格等等。

    而其中,序列形的数据就不太好用原始的神经网络处理了。

    为了建模序列问题,RNN引入了隐状态h(hidden state)的概念,h可以对序列形的数据提取特征,接着再转换为输出。

    先从h_{1}的计算开始看:


    图示中记号的含义是:
    a)圆圈或方块表示的是向量。
    b)一个箭头就表示对该向量做一次变换。如上图中h_{0}x_{1}分别有一个箭头连接,就表示对h_{0}x_{1}各做了一次变换。
    在很多论文中也会出现类似的记号,初学的时候很容易搞乱,但只要把握住以上两点,就可以比较轻松地理解图示背后的含义。

    h_{2}的计算和h_{1}类似。但有两点需要注意下:

    1. 在计算时,每一步使用的参数U、W、b都是一样的,也就是说每个步骤的参数都是共享的,这是RNN的重要特点,一定要牢记;
    2. 而下文马上要看到的LSTM中的权值则不共享,因为它是在两个不同的向量中。而RNN的权值为何共享呢?很简单,因为RNN的权值是在同一个向量中,只是不同时刻而已。


    依次计算剩下来的(使用相同的参数U、W、b):


    我们这里为了方便起见,只画出序列长度为4的情况,实际上,这个计算过程可以无限地持续下去。

    我们目前的RNN还没有输出,得到输出值的方法就是直接通过h进行计算:


    正如之前所说,一个箭头就表示对对应的向量做一次类似于f(Wx+b)的变换,这里的这个箭头就表示对h1进行一次变换,得到输出y1。

    剩下的输出类似进行(使用和y1同样的参数V和c):

    OK!大功告成!这就是最经典的RNN结构,是x1, x2, .....xn,输出为y1, y2, ...yn,也就是说,输入和输出序列必须要是等长的。

    1.2 RNN的应用
    人类并不是每时每刻都从一片空白的大脑开始他们的思考。在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义。我们不会将所有的东西都全部丢弃,然后用空白的大脑进行思考。我们的思想拥有持久性。

    传统的神经网络并不能做到这点,看起来也像是一种巨大的弊端。例如,假设你希望对电影中的每个时间点的时间类型进行分类。传统的神经网络应该很难来处理这个问题:使用电影中先前的事件推断后续的事件。循环神经网络RNN解决了这个问题。

    通过上文第一节我们已经知道,RNN是包含循环的网络,在这个循环的结构中,每个神经网络的模块,读取某个输入,并输出一个值(注:输出之前由y表示,从此处起,改为隐层输出h表示),然后不断循环。循环可以使得信息可以从当前步传递到下一步。

    这些循环使得RNN看起来非常神秘。然而,如果你仔细想想,这样也不比一个正常的神经网络难于理解。RNN可以被看做是同一神经网络的多次复制,每个神经网络模块会把消息传递给下一个。所以,如果我们将这个循环展开:

    链式的特征揭示了RNN本质上是与序列和列表相关的。他们是对于这类数据的最自然的神经网络架构。

    1.3 RNN的局限:长期依赖(Long-TermDependencies)问题

    RNN的关键点之一就是他们可以用来连接先前的信息到当前的任务上,例如使用过去的视频段来推测对当前段的理解。如果RNN可以做到这个,他们就变得非常有用。但是真的可以么?答案是,还有很多依赖因素。

    有时候,我们仅仅需要知道先前的信息来执行当前的任务。例如,我们有一个语言模型用来基于先前的词来预测下一个词。如果我们试着预测“the clouds are in the sky”最后的词,我们并不再需要其他的信息,因为很显然下一个词应该是sky。在这样的场景中,相关的信息和预测的词位置之间的间隔是非常小的,RNN可以学会使用先前的信息。


    但是同样会有一些更加复杂的场景。假设我们试着去预测“I grew up in France...I speak fluent French”最后的词。当前的信息建议下一个词可能是一种语言的名字,但是如果我们需要弄清楚是什么语言,我们是需要先前提到的离当前位置很远的France的上下文的。这说明相关信息和当前预测位置之间的间隔就肯定变得相当的大。

    不幸的是,在这个间隔不断增大时,RNN会丧失学习到连接如此远的信息的能力。


    在理论上,RNN绝对可以处理这样的长期依赖问题。人们可以仔细挑选参数来解决这类问题中的最初级形式,但在实践中,RNN肯定不能够成功学习到这些知识。Bengio,etal.(1994)等人对该问题进行了深入的研究,他们发现一些使训练RNN变得非常困难的相当根本的原因。

    换句话说, RNN 会受到短时记忆的影响。如果一条序列足够长,那它们将很难将信息从较早的时间步传送到后面的时间步。

    因此,如果你正在尝试处理一段文本进行预测,RNN 可能从一开始就会遗漏重要信息。在反向传播期间(反向传播是一个很重要的核心议题,本质是通过不断缩小误差去更新权值,从而不断去修正拟合的函数),RNN 会面临梯度消失的问题。

    因为梯度是用于更新神经网络的权重值(新的权值 = 旧权值 - 学习率*梯度),梯度会随着时间的推移不断下降减少,而当梯度值变得非常小时,就不会继续学习。​

    换言之,在递归神经网络中,获得小梯度更新的层会停止学习—— 那些通常是较早的层。 由于这些层不学习,RNN 可以忘记它在较长序列中看到的内容,因此具有短时记忆。

    而梯度爆炸则是因为计算的难度越来越复杂导致。

    然而,幸运的是,有个RNN的变体——LSTM,可以在一定程度上解决梯度消失和梯度爆炸这两个问题!

     

     

    二、LSTM网络
    Long ShortTerm 网络——一般就叫做LSTM——是一种RNN特殊的类型,可以学习长期依赖信息。当然,LSTM和基线RNN并没有特别大的结构不同,但是它们用了不同的函数来计算隐状态。LSTM的“记忆”我们叫做细胞/cells,你可以直接把它们想做黑盒,这个黑盒的输入为前状态和当前输入。这些“细胞”会决定哪些之前的信息和状态需要保留/记住,而哪些要被抹去。实际的应用中发现,这种方式可以有效地保存很长时间之前的关联信息。

    2.1 什么是LSTM网络

    举个例子,当你想在网上购买生活用品时,一般都会查看一下此前已购买该商品用户的评价。


    当你浏览评论时,你的大脑下意识地只会记住重要的关键词,比如“amazing”和“awsome”这样的词汇,而不太会关心“this”、“give”、“all”、“should”等字样。如果朋友第二天问你用户评价都说了什么,那你可能不会一字不漏地记住它,而是会说出但大脑里记得的主要观点,比如“下次肯定还会来买”,那其他一些无关紧要的内容自然会从记忆中逐渐消失。

    而这基本上就像是 LSTM 或 GRU 所做的那样,它们可以学习只保留相关信息来进行预测,并忘记不相关的数据。简单说,因记忆能力有限,记住重要的,忘记无关紧要的。


    LSTM由Hochreiter&Schmidhuber(1997)提出,并在近期被AlexGraves进行了改良和推广。在很多问题,LSTM都取得相当巨大的成功,并得到了广泛的使用。
    LSTM通过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是LSTM的默认行为,而非需要付出很大代价才能获得的能力!

    所有RNN都具有一种重复神经网络模块的链式的形式。在标准的RNN中,这个重复的模块只有一个非常简单的结构,例如一个tanh层。

    激活函数 Tanh 作用在于帮助调节流经网络的值,使得数值始终限制在 -1 和 1 之间。


    LSTM同样是这样的结构,但是重复的模块拥有一个不同的结构。具体来说,RNN是重复单一的神经网络层,LSTM中的重复模块则包含四个交互的层,三个Sigmoid 和一个tanh层,并以一种非常特殊的方式进行交互。

    上图中,σ表示的Sigmoid 激活函数与 tanh 函数类似,不同之处在于 sigmoid 是把值压缩到0~1 之间而不是 -1~1 之间。这样的设置有助于更新或忘记信息:

    • 因为任何数乘以 0 都得 0,这部分信息就会剔除掉;
    • 同样的,任何数乘以 1 都得到它本身,这部分信息就会完美地保存下来。

    相当于要么是1则记住,要么是0则忘掉,所以还是这个原则:因记忆能力有限,记住重要的,忘记无关紧要的

    此外,对于图中使用的各种元素的图标中,每一条黑线传输着一整个向量,从一个节点的输出到其他节点的输入。粉色的圈代表pointwise的操作,诸如向量的和,而黄色的矩阵就是学习到的神经网络层。合在一起的线表示向量的连接,分开的线表示内容被复制,然后分发到不同的位置。


    2.2 LSTM的核心思想
    LSTM的关键就是细胞状态,水平线在图上方贯穿运行。
    细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。

    LSTM有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个sigmoid神经网络层和一个pointwise乘法的非线性操作。

    如此,0代表“不许任何量通过”,1就指“允许任意量通过”!从而使得网络就能了解哪些数据是需要遗忘,哪些数据是需要保存。

    LSTM拥有三种类型的门结构:遗忘门/忘记门、输入门和输出门,来保护和控制细胞状态。下面,我们来介绍这三个门。

     


    三、逐步理解LSTM
    3.1 忘记门
    在我们LSTM中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为“忘记门”的结构完成。该忘记门会读取上一个输出和当前输入,做一个Sigmoid 的非线性映射,然后输出一个向量f_{t}(该向量每一个维度的值都在0到1之间,1表示完全保留,0表示完全舍弃,相当于记住了重要的,忘记了无关紧要的),最后与细胞状态相乘。

    类比到语言模型的例子中,则是基于已经看到的预测下一个词。在这个问题中,细胞状态可能包含当前主语的性别,因此正确的代词可以被选择出来。当我们看到新的主语,我们希望忘记旧的主语,进而决定丢弃信息。

    大部分初学的读者看到这,可能会有所懵逼,没关系,我们分以下两个步骤理解:

    1. 对于上图右侧公式中的权值W_{f},准确的说其实是不共享,即是不一样的。有的同学可能第一反应是what?别急,我展开下你可能就瞬间清晰了,即:f_{t} = \sigma (W_{fh}h_{t-1} + W_{fx} x_{t} + b_{f})
    2. 至于右侧公式和左侧的图是怎样的一个一一对应关系呢?如果是用有方向的水流表示计算过程则将一目了然,上动图!红圈表示Sigmoid 激活函数,篮圈表示tanh 函数:


    3.2 输入门
    下一步是确定什么样的新信息被存放在细胞状态中。这里包含两个部分:
    第一,sigmoid层称“输入门层”决定什么值我们将要更新;
    第二,一个tanh层创建一个新的候选值向量,会被加入到状态中。
    下一步,我们会讲这两个信息来产生对状态的更新。

    在我们语言模型的例子中,我们希望增加新的主语的性别到细胞状态中,来替代旧的需要忘记的主语,进而确定更新的信息。

    继续分两个步骤来理解:

    1. 首先,为便于理解图中右侧的两个公式,我们展开下计算过程,即i_{t} = \sigma (W_{ih}h_{t-1} + W_{ix}x_{t} + b_{i})\tilde{C_{t}} = tanh(W_{Ch}h_{t-1} + W_{Cx}x_{t} + b_{C})
    2. 其次,上动图!


    3.3 细胞状态
    现在是更新旧细胞状态的时间了,更新为。前面的步骤已经决定了将会做什么,我们现在就是实际去完成。
    我们把旧状态与相乘,丢弃掉我们确定需要丢弃的信息。接着加上。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。
    在语言模型的例子中,这就是我们实际根据前面确定的目标,丢弃旧代词的性别信息并添加新的信息的地方,类似更新细胞状态。

    再次动图!


    3.4 输出门
    最终,我们需要确定输出什么值。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。

    首先,我们运行一个sigmoid层来确定细胞状态的哪个部分将输出出去。
    接着,我们把细胞状态通过tanh进行处理(得到一个在-1到1之间的值)并将它和sigmoid门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。

    在语言模型的例子中,因为他就看到了一个代词,可能需要输出与一个动词相关的信息。例如,可能输出是否代词是单数还是负数,这样如果是动词的话,我们也知道动词需要进行的词形变化,进而输出信息。

    依然分两个步骤来理解:

    1. 展开图中右侧第一个公式,o_{t} = \sigma (W_{oh}h_{t-1} + W_{ox}x_{t} + b_{o})
    2. 最后一个动图:

     


    四、LSTM的变体
    我们到目前为止都还在介绍正常的LSTM。但是不是所有的LSTM都长成一个样子的。实际上,几乎所有包含LSTM的论文都采用了微小的变体。差异非常小,但是也值得拿出来讲一下。
    4.1 peephole连接与coupled
    其中一个流形的LSTM变体,就是由Gers&Schmidhuber(2000)提出的,增加了“peepholeconnection”。是说,我们让门层也会接受细胞状态的输入。

    peephole连接

    上面的图例中,我们增加了peephole到每个门上,但是许多论文会加入部分的peephole而非所有都加。

    另一个变体是通过使用coupled忘记和输入门。不同于之前是分开确定什么忘记和需要添加什么新的信息,这里是一同做出决定。我们仅仅会当我们将要输入在当前位置时忘记。我们仅仅输入新的值到那些我们已经忘记旧的信息的那些状态。

     

    4.2 GRU
    另一个改动较大的变体是GatedRecurrentUnit(GRU),这是由Cho,etal.(2014)提出。它将忘记门和输入门合成了一个单一的更新门。同样还混合了细胞状态和隐藏状态,和其他一些改动。最终的模型比标准的LSTM模型要简单,也是非常流行的变体。

    为了便于理解,我把上图右侧中的前三个公式展开一下

    1. z_{t} = \sigma (W_{zh}h_{t-1} + W_{zx}x_{t})
    2. r_{t} = \sigma (W_{rh}h_{t-1} + W_{rx}x_{t})
    3. \tilde{h} = tanh(W_{rh}(r_{t}h_{t-1}) + W_{x}x_{t})

    这里面有个小问题,眼尖的同学可能看到了,z_{t}r_{t}都是对h_{t-1}x_{t}做的Sigmoid非线性映射,那区别在哪呢?原因在于GRU把忘记门和输入门合二为一了,而z_{t}是属于要记住的,反过来1- z_{t}则是属于忘记的,相当于对输入h_{t-1}x_{t}做了一些更改/变化,而r_{t}则相当于先见之明的把输入h_{t-1}x_{t}z_{t}/1- z_{t}对其做更改/变化之前,先事先存一份原始的,最终在\tilde{h}那做一个tanh变化。

    这里只是部分流行的LSTM变体。当然还有很多其他的,如Yao,etal.(2015)提出的DepthGatedRNN。还有用一些完全不同的观点来解决长期依赖的问题,如Koutnik,etal.(2014)提出的ClockworkRNN。

    要问哪个变体是最好的?其中的差异性真的重要吗?Greff,etal.(2015)给出了流行变体的比较,结论是他们基本上是一样的。Jozefowicz,etal.(2015)则在超过1万种RNN架构上进行了测试,发现一些架构在某些任务上也取得了比LSTM更好的结果。

     

     

    五、LSTM相关面试题

    为帮助大家巩固以上的所学,且助力找AI工作的朋友,特从七月在线AI题库里抽取以下关于LSTM的典型面试题,更具体的答案参见:https://www.julyedu.com/search?words=LSTM(打开链接后,勾选“面试题”的tab)。

    1. LSTM结构推导,为什么比RNN好?
    2. GRU是什么?GRU对LSTM做了哪些改动?
    3. LSTM神经网络输入输出究竟是怎样的?
    4. 为什么LSTM模型中既存在sigmoid又存在tanh两种激活函数,而不是选择统一一种sigmoid或者tanh?这样做的目的是什么?
    5. 如何修复梯度爆炸问题?
    6. 如何解决RNN梯度爆炸和弥散的问题?

     

     

    六、参考文献

    1. ChristopherOlah的博文《理解LSTM网络
    2. @Not_GOD 翻译ChristopherOlah的博文《理解LSTM网络
    3. RNN是怎么从单层网络一步一步构造的?
    4. 通过一张张动图形象的理解LSTM
    5. 如何理解LSTM网络(超经典的Christopher Olah的博文之July注解版)
    6. LSTM相关的典型面试题:https://www.julyedu.com/search?words=LSTM(打开链接后,勾选“面试题”的tab)
    7. 如何理解反向传播算法BackPropagation
    展开全文
  • 如何一步一步成为一个领域专家

    万次阅读 多人点赞 2021-01-30 12:58:59
    其实这种巨大的差异在我们工作生活中反反复复出现,同时很多行业专家在不断的普通人拉开距离,就像穷人和富人的财富不断距离不断拉大一样。 一个优秀的开发者只需要三个键 原因在哪里呢?有人说成为专家要靠经验...

    经常有人问我,为什么有的人工作10年仍然平台无奇,而有的人只用3年时间,就已经脱颖而出,成绩斐然。我说,是呀,有些参加工作多年却仍然只会复制粘贴简单业务代码,有些人在大学就写出Linux操作系统。其实这种巨大的差异在我们工作生活中反反复复出现,同时很多行业专家在不断的与普通人拉开距离,就像穷人和富人的财富不断距离不断拉大一样。

    一个优秀的开发者只需要三个键

     

    原因在哪里呢?有人说成为专家要靠经验 ,任何一个工作10年以上的人都很有经验,他们通常在本领域有1万小时的实践时间,但是现实是他们大部分并没有做到领域内专家。记得好像有个每个的商学院有一项研究发现:比起只有少量经验的人,大体而言,更有经验的管理者并没有产生高效的效果。

    有人说要靠天赋,他们搬来爱迪生的名言 “天才就是百分之一的灵感,和百分之九十九的汗水。但是,这百分之一的灵感远比百分之九十九的汗水重要”,嗯,爱迪生说的当然有道理,后半句更有道理(好像小学老师刻意忘记教导我们后半句了),但是我们这里讨论的是如何成为专家,我们只是要成为专家,而不是要挑战爱迪生这样的天才或者他的手下“最接近神的男人”特斯拉。研究表明,天赋在成为专家这个普通难度的挑战中,并不是决定因素。

    那什么是真正的决定因素呢?

    著名心理学家艾利克森在“专业特长科学”领域潜心几十年,研究了一系列行业或领域中的专家级人物:国际象棋大师、顶尖小提琴家、运动明星、记忆高手、拼字冠军、杰出医生等。他发现,不论在什么行业或领域,提高技能与能力的最有效方法全都遵循一系列普遍原则,他将这种通用方法命名为“刻意练习”。对于在任何行业或领域中希望提升自己的每个人,刻意练习是黄金标准,是迄今为止发现的最强大的学习方法。艾利克森把他的研究成果写成了一本书,喏,就是这本。我想现在肯定有人会说,“这本书我看看过,里面的案例都是万年不变的背诵,钢琴,国际象棋,这些技能不太变化的领域,我有108种方式来反驳。。。” 好吧,我想说别那么知乎好不好(当然如果反驳我能让您高兴,那我也挺高兴的,好歹我的文字间接让人快乐了,当然你说这本书很啰嗦,这我倒是同意的),心理学大师的研究对我们是有帮助的,哪怕是在这个变化无比迅速的计算机领域。

    这本书真的很啰嗦

     

    首先 这里的“刻意练习”可以让我们成为专家,为什么普通工作经验不能,区别在哪里?

    区别在于这本书中提到的刻意练习是指为了提高绩效而被刻意设计出来的练习,它有明确的目标,并且要求一个人离开自己的熟练和舒适区域,不断地依据设定好的方法去练习和提高。这种刻意练习而不是单纯的工作经验(俗称摸鱼经验),真正决定了顶尖大师和一般职员的差距。有的人有10年工作经验,但是大部分时间都在无意识地重复自己已经做过的事情,其实可以说是将1年重复过了10次而已,他真正刻意练习的时间可能10小时都不到。有的人进入相关领域只有3年时间,但是每天花费大量的时间做刻意练习,不断挑战自己完成技能的边界,用于刻意练习的时间可能会有2000小时所以,为什么有的人工作10年,仍然不是专家,而有的人只用3年时间,就已经脱颖而出,成绩斐然。他们真是的差异可能是10小时和几千小时的差异,所以他们相应了获得10小时的成果和几千小时的成果,那谁更容易成为专家,结果很明显。

     

    好了,讨论刻意练习能够成为专家的文章很多,如果这篇文章就到这里结束,那我写这篇文章也就没有多大意义了,我们还是继续分析一下,如何在计算机领域成为专家,当然其他领域也适用,只是我们在程序员聚集地当然要讨论的是程序员技能,如果分析的例子是如何成为优秀的厨子当然就不是很合适了。

    如何进行刻意练习呢?

    我认为主要有下面几点

    1、激发刻意练习的意识

       人最最重要的是思维,思维指导你前进的方向,刻意练习也是一样。那所谓激发刻意练习的意识是什么呢? 我的理解就是你这个人,有不断努力自我提升的想法,然后你知道了刻意练习,并且相信它对达成你的目标有帮助,准备开始刻意练习。如果你不想努力,那你如何能够获得成功呢? 刻意练习不是鸡汤,它是确实可以帮助你成功的方法,但是它需要你信任它,并且为之付出努力。 

    2、识别出你需要什么做哪些方面的刻意练习

         有动力,有激情很容易。但是实操呢? 很多人懂得了很多道理,确依然过不好这一生。这关键就在实操上。    好了,我们怎么进行刻意练习呢。我认为最重要的是识别出你需要什么做哪些方面的刻意练习?只有正确的识别出来,达到目标的条件是哪些,然后我们刻意练习才有方向。很多人盲目的努力,不断的翻看着各种公众号,看着里面贩卖焦虑的文章,心里想着我该做什么好呢?其实没有那么麻烦你有有下面几步可以操作。

         1)摸清路线,善用前人总结的系统经验,

             当你初入某个领域,还摸不到方向时,你可以购买优秀书籍,或者到专业论坛,问答网站搜索这个领域的学习路线图,这些网站中优秀的文章不但会告诉你如何快速认识这个领域,如何在这个领域迅速成长,甚至连学习资料都给你收集整理好,而你只需要点个赞就能拿走,当然你也可以打赏,这是一种性价比最高的获取本领域成长路线的方法。比如你要学习Java,这里是CSDN,那我们就找一下关于如何学习Java的文章,比如我随便一搜索就能找到多篇优秀文章,这样我就能迅速知道大概学的的方向。

           但是有的时候,当我们研究的专业比较偏门,或者自己已经度过了中级阶段,正在往专家阶段冲刺,这个时候往往不能轻易找到系统性的前进方向,这个时候该怎么办?我认为这个时候你可以设法请教这个行业的专家(不一定非要专家,哪怕是你能联系上的高手也可以),让已经成为专家的人指点你应该如何去做,必要时可以付费请他指导,其实非常划算,未来收益极高,很多人缺乏这样的远见。其实很多时候你会发现专家会非常乐于无偿指点后辈,大多数情况无需付费,一杯咖啡就能换来交流的机会。另外如果实在无法联系到专家,你可以搜集专家的资料,发表的文章、演讲,观察专家做什么,你就做什么,复制专家的行为是你快速成长的好方法,当然成为顶级那需要有自身的独到见解或者开创新的领域,本文我们只是讨论如何成为普通专家。

        2)识别目标技能,将需要长期训练的技能分解成子技能

           当我们有了基本的前进路线时,我们需要根据自身情况对其进行调整使其更加适合我们自身当前的情况。更重要的一步是分解技能,将复杂的技能如需要耗时1年的技能,分解为若干个练习起来耗时较短的子技能,比如2周(学过算法导论的同学是不是很眼熟啊^-^),随手举个栗子,假如我们经过分析发现要成长为一个优秀的软件专家需要以下技能,随便分的不要纠结正确性完备性这里不是某呼。

         我们发现程序员的编程能力是一个核心能力,但是这个能力太大,太广泛了,如果我把它设定为刻意练习的目标,这显得太大了,一下难以达到,无法具体实施。那怎么办呢,很简单,算法导论,设计模式里已经介绍了啊,分解。比如我随便分解一下

     

          好了,看到了这里的第一项“开发工具使用纯熟度”很多同学就会眼前一亮了吧,这个我可以做啊。对的,现在很简单,无论你用Vim、Eclipse、VS还是什么IDE,你可以设定一个1-2周的刻意练习计划,找到相关资料,专门练习该项目,这样短期只能你的开发工具使用纯熟对迅速提升,后期如果保持日常使用的话,你的水平会稳定保持在一定水准。 对于下一项,数据结构类编程,我们一看,这个范围还是有点大,那就继续分解
    为树类数据结构编程训练,数组类数据结构编程训练等等。

         这里需要特别提醒,不要一直盯着硬技能,软技能同样甚至更加重要,我们也需要将分解,这个时候你可以回到步骤1,按步骤1的方式识别出子技能,当然软技能比较难以识别出子技能,但是也没有必要识别出区分度高的子技能,例如我随手将程序员沟通能力按以下分解^-^

            

     3)反思自己当前的工作是否需要刻意练习

              对于大的方向,明确的方向我们可以容易使用上述方法1,方法2寻找刻意练习的目标,但是还有一个关键点我们往往会忽视,就是很多我们日常习以为常的工作,我们认为没什么的小事情,其实经过刻意练习之后也会产生很大的价值,但我们总是觉得习以为常,而导致忽略。举个例子,眼神交流,有多少人练习过如何使用眼神表达支持,如何用眼神提升谈判的压迫力,如何用眼神制造聊天的亲和力,我想大多数人没有,那有眼神交流没有用呢,对你我不知道,但是我知道对我很有用。又比如,如何写邮件,对同一件事情,如何简洁又不失条理的描述清楚事实,如何优化表达获取领导更多的支持,这也是可以练习的。很多人就是忽略了日常工作中这些值得刻意练习的点,满足于现状,满足于把工作做到60分,而有些人却能发现这些值得刻意练习的点,不满足于仅仅完成工作,而是通过不断刻意练习提升自己,日积月累这些就和普通人拉开差距,更早的达到领域专家。

    感受到我眼神的杀伤力了吗

    3、 设定目标达成激励计划

            分解出了来了,然后怎么办,执行吗? 

           不不要着急,在执行之前,我们还有一个重要的工作要做。要知道,无论什么技能,无论你原来是多么热爱,在长期的刻意练习中,比如长达几千小时的重复训练,这些原来令你感到快乐,高兴的事情,都会慢慢的褪去光泽,变得枯燥,变得味同嚼蜡毫无乐趣可言。因此你需要还需要一份有效的激励计划

          一说到激励计划,很多人马上就说,这很容易啊。比如每次我设定目标时我都会告诉自己,如果达成了就送自己某某奖励,比如一场出国旅游,一个款最新的手机,或者某个心仪已久的东西。 OK,这些激励确实是可以的,但是它的效果很一般,你反思一下,是不是自己很多时候都达成不了目标,而你往往把原因归结为执行力上,其实这些效果低下的激励方式也拖累了你。

           那什么是比较好的激励方式呢? 我认为是即时反馈激励。什么是即时反馈激励呢,说白了就是你刻意练习的成果立马就有反馈,打个最容易理解的比方,比如你最近在减肥,练习了1周,你称重时发现自己轻了3kg这个时候你把自己的健身成果转发到了朋友圈,没过5分钟就有100+好友给你点赞,然后你心里有点小得意,这就是一个典型的即时反馈。研究表明正向的即时反馈可以有效的促进大脑多巴胺的分泌,让你产生喜悦情绪,这回让你产生强烈的刻意练习的动力。 又比如,你最近想要练习逻辑思维能力,你可以定期梳理自己最近的逻辑思维总结,写成文章发到朋友圈、公众号,或者直接找你的好友点评或者即时的反馈,通过不断的反馈,继续练习,反馈,再练习,你刻意练习的技能会迅速成长。再者,你刻意为你分解好的子目标设立激励,比如这周练习好了这个技能,就奖励自己XXX,这样将看起来遥遥无期的激励,分解为触手可及的奖励,这样对你达到长期目标会生成良好效果,当然另外记住分享时你要选对地方,负向激励同样会产生巨大的打击效果。

         总之,设法为你刻意练习的小目标设法找到一个能够获得正向即时激励的好方式,不断的非周期性的激励自己练习。

             

     4、设定练习计划

         在设定好了激励计划的同时,其实我们的练习计划也已经有了眉目。比如一个大目标,分解为若干短期的子目标,我们就不断执行,定期修正即可。但是这里需要补充几点。

         1)不要设定非人性的时间计划

         很多人一提起计划,就把网上哪些大神、学霸的计划表拿过来,比如早上4:30起床,4:50-5:30学习单词,5:30-5:35休息,5:36-6:00学习短句,6:00-6:15吃早饭.... 我想说的是这些时刻安排表大多数是非人性的,对于普通人几乎无法坚持,对于每天上班的打工人来说更难,说不定老板突然找你就会打断自己的计划,所以我建议你最好设定弹性时间表,比如今天上午计划设定3次刻意练习,每次25分钟,你可以在今天上午任何你可以拿出整25分钟的时段进行刻意练习,不用考虑将其固定在某个时间点上,你要你有进入刻意练习的条件,你就迅速进入状态,将其执行完毕,并且不用过于追求极度饱和的工作时间表,很多每天忙得团团转的人其实很多时候只是在虚耗光阴而已,你只要保证长期的刻意练习,超过这些人是迟早的事情

     

        2)练习的最高级别是教会别人

        有人问我练习的最高级别是什么,我认为是输出,准确的说是你教会别人。对于某项技能,其实你最快掌握的方式不是自己学习,而是设法教会别人。在设法教会别人的过程中你会反复的强化自己的掌握水平,如果有个东西你给完全不懂的人讲懂了,那说明你自己已经掌握,如果你自己还理解的半懂不懂,那你肯定无法教会别人。有很多方法可以参考,比如你最近对某项技术进行了分析总结,你可以写成材料,在小组或者公司内部开一场分享会,向同事分享的的经验,并且设法教会原来对此一无所知的参会者。或者你可以“练习给妈妈写信”假如你要给你的妈妈写信介绍你最近的学习成果,但是你的妈妈对这个领域一无所知,你就要用妈妈最能理解的方式向她阐述,如果你能写出这样一封信来,那你对这次的学习成果掌握程度肯定达到了较高水平。

     

     

    5 、让你的计划顺利实施的小贴士

     好了说了半天,让我们来到最后一个环节,如何保证你的计划顺利实施。其实在前面分解技能,即时反馈,时间表设计上已经和这个问题有交集了。这里我想说的是,没有什么人、什么方法可以保证你的计划完整顺利的实施。但是又些小贴士可以帮助你更顺利的完成,例如

     1)提升时间管理能力

       网上关于时间管理的讨论简直数不胜数,时间管理大师,也是比比皆是,特别是娱乐界楷模辈出。如果你没有深入研究过时间管理,精力管理,那你还是有必要系统学习一下(你看,回到第1,第2条了),但我就不多说了,简单推荐一下书籍吧,例如《小强升职记》这本书就不错,另外还有很多其他的优秀的书籍、论坛大家可以根据需要选择学习。

    2)时间先支付自己

       很多学习理财的同学往往都学习过这条道理“学会先支付给自己”,说的是每次是指首先把自己的工作收入和其他收入投入到自己的资产项目中,它是致富中最重要的法则之一。对于人生来说,时间其实就是我们的最重要的货币并且对于每个人来说它都是平等的,我们往往把自己最重要的货币支付率先支付给了错误的对象。所以建议你最好每天抽出固定时间,比如上班开始工作前,下班后某个时间段,排除干扰把时间先支付给自己,对某个领域进行刻意练习。

    3)学会延时享受

      这个就不多说了,即时激励很重要,但是同时如果能够提升延时享受的能力,这会帮助你更快抵达你的目标。

      好了,另外要有一定要记住要有耐心,方向正确慢就是快,祝各位早日成为领域专家。另外欢迎交流,建了一个个人博客http://www.chenxiaofang.site/,CSDN不再更新

     

     

     

     

     

          

     

     

     

    展开全文
  • 下一步 js代码展示: $(document).ready(function(){ $("#education").addClass('main-hide'); $("#work").addClass('main-hide'); $("#social").addClass('main-hide'); $('#previous_step')....
  • 让 maven为您工作起来

    万次阅读 热门讨论 2009-12-09 17:48:00
    maven 让您的构建不是一般的...这一步比较简单,学java的同学应该都会,不罗嗦了,检验JDK是否安装好,可以输入如下命令后回车(windows系统) 第二,下载maven并进行安装,maven下载地址http://maven.apache.org/down
  • 一步一步认识用户画像

    万次阅读 热门讨论 2016-11-25 00:22:28
    一步一步认识用户画像标签: 用户画像 GBDT 建模 Python作为一名资深吃瓜群众,身处大数据时代,过去一直不知道用户画像的存在。用户画像到底是何来头,下面会一一告诉你~
  • 一步一步学会系统发布

    千次阅读 热门讨论 2014-12-20 08:05:52
    跟着牛腩老师做完发布系统,所有的结局都已写好,一场初雪,美的让我忘了还欠她一个美丽的转身--发布,但是小编...维护工作是极大耐心的。从头到尾读着别人写的代码,复制别人的想法,做着自己的维护......是不是每个搞
  • 工作流学习——Activiti整体认识二

    万次阅读 多人点赞 2015-06-22 17:47:32
     在上一篇文章中我们将工作流的相关概念、 activiti 的前世今生、 activiti jbpm 的比较进行学习,这篇文章我们正式进行 activiti 的学习, activiti 的整个学习我们主要通过例子的形式来理解。今天我们主要是...
  • Qt一步一步实现插件调用(附源码) 最近手里几个项目都采用插件的方式进行开发工作,这里记录一下实现方法,给需要的同学一个参考, 在linux系统和window系统都能成功编译通过,不废话直接步骤 第一:建立...
  • 我们如何走到这一步

    万次阅读 2018-12-31 16:14:41
    那个群里只有学生,没有导师和博后工作人员,大家纷纷表示祝福,走到这一步不容易。 而我仿佛又看到了几年前,瘦弱的师妹冬天在没有暖气的实验室里穿着一件单衣披着白大褂,带着防毒面具边咳嗽边做酰卤的身影,那一...
  • 1.JDKAPK的版本不一致,可能APK是用1.7编写的,但是你用的SDK却是1.8的,这样肯定是无法编译的 2.apktool版本过于陈旧(也有可能太新,查资料的时候有发现个别换回旧版本可以编译,新的反而不行,这个你们自己尝试),目前...
  • 下一步我向何处去?--leo回答女大学生的一封信

    千次阅读 热门讨论 2008-09-21 07:49:00
    岁的项目经理,下一步我往何处去??? 计算机专业毕业了,还要不要参加培训班? 入职前夕,公司的职位取消 -- 我能不能告? 读了我不喜欢的专业、迷茫了,之后应该??? 程序员是应该干工作?还是干...
  • 一步一步做网线接头

    万次阅读 2006-06-07 10:27:00
     第4:把套在网线的金属套环推到网线BNC连接器连接处,再把网线钳的六角缺口卡在确定好的套环位置上,紧握网线钳手柄,紧压,使网线BNC连接器通过BNC金属套环紧紧连接起来,如图15所示。压好后的金属套环呈...
  • 数据通路选择 上面的各运算单元是并行工作的,对于输入的两个操作数,几个运算单元都会计算结果,至于输出哪一个,要通过后面的数据选择器来控制了。选择器的选择开关接的是操作符,这样输出结果就是操作数对应的...
  • 九之再续:教你一步一步用c语言实现sift算法、上

    万次阅读 多人点赞 2011-03-13 09:32:00
    教你一步一步用c语言实现sift算法、上作者:July、二零一一年三月十二日出处:http://blog.csdn.net/v_JULY_v参考:Rob Hess维护的sift 库环境:windows xp+vc6.0条件:c语言实现。说明:本BLOG内会陆续一一实现所有...
  • http://blog.sina.com.cn/circlewood2010 一步一步搭建mips-linux-gcc-4.4.0交叉编译工具   一、准备工作:  工作环境:宿主机:ubuntu10.04 linux-2.6.32-24-generic i686
  • 最近在参加一个漫画人脸识别图像比赛,虚拟机实在太卡,内存又只有4个G,所以决定安装一个双系统,这样既可以保证在win7系统办公又可以流畅的跑图像模型: 我是用U盘安装,参考了CSDN上一些教程并结合自己的硬件...
  • 最近闲着看了一下jcenter的使用,也想将自己使用频率比较高的东西抽成类库,然后通过compile来使用,...第一:首先是注册,这就是我踩的最大的一个坑,导致我一天都没有上传成功。网上说的都是去jcenter的网站上注册
  •  一般情况我们调试的时候是在一个线程中的,一步一步走。但有时候你会发现在Debug的时候,想发起另外一个请求都无法进行了?  那是因为IDEA在Debug时默认阻塞级别是ALL,会阻塞其它线程,只有在当前调试线程...
  • 一步一步教你 https 抓包

    千次阅读 2016-11-21 13:31:19
    ,如果你看到如下页面说明你已成功进入抓包模式,迈出了第一,cheer~ 接下去你可以用手机打开一些 App,不出意外你能看到一些 http 请求的列表。这时候我们还无法抓到 https 的包,还需要做一些额外...
  • 一步一步学装电脑(有图) 对于高手而言,如何将各种各样的配件组装成一台电脑是轻而易举的事,但对于大多数初接触电脑的读者而言却不是这样了。对于许多想学会装机了解电脑组装DIY知识的读者而言,如何才能将各种...
  • 步进电机工作原理细分原理个人理解

    千次阅读 多人点赞 2019-02-21 15:05:55
    首先需要了解的是步进电机的工作原理,步进电机如其名,一步一步前进,按照一定的步伐(旋转角度,称之为距脚)来工作。首先我们了解一下步进电机的内部结构,如图: ...
  • Qt一步一步实现插件调用(附源码)

    千次阅读 2016-04-10 08:58:52
    最近手里几个项目都采用插件的方式进行开发工作,这里记录一下实现方法,给需要的同学一个参考, 在linux系统和window系统都能成功编译通过,不废话直接步骤 第一:建立插件原型 新建一个Qt项目,实现一...
  • 第一安装小乌龟。 如下: 具体安装好像没什么具体要求,一路next,就好。 如上图箭头所示,在安装 TortoiseSVN 的时候,默认 command line client tools,是不安装的,这里建议勾选上。 这个我不确定我...
  • 题目: 一个机器人位于一个 m x n 网格的左上角 (起始点在图中标记为“Start” )。 机器人每次只能向或者向右移动一步。...思路:因为机器人每次只能向或者向右移动一步,所以机器人在走到右角那...
  • 一步一步教会你JAVA中调用C++

    千次阅读 2014-08-05 10:47:06
     JNI:Java Native Interface,是Java语言提供的一种通用接口,用于Java代码本地化代码的交互。所谓本地化代码是指直接编译成的机器相关的二进制代码,而非Java字节码之类的中间代码。Windows下面的可执行文件...
  •  然后就开始第二,这一步是最关键的,但其中在这一步中搞清楚两点也不会很困难,1、注意片选信号和flash读写时序的关系;2、SPI总线的全双工特性。 这里特别声明一下,由于SPI总线是全双工的,所以在编写驱动时...
  • 一步一步创建VC2005解决方案

    万次阅读 热门讨论 2007-09-03 08:51:00
    一般情况,一个解决方案都会包含多个项目,比如:其中一些是静态库项目,一些是动态库项目,当然还会有应用程序项目。另外,根据需要,还可能会使用一些第三方库。因此为解决方案设置一个合理的目录结构并配合一定...
  • 【跟我一步一步学Struts2】——登陆例子

    千次阅读 热门讨论 2014-07-14 09:54:07
    本篇博客通过一个简单的登陆小例子来入门,简单了解一下struts2是如何工作的:...第一引入Jar包: commons-fileupload-1.2.1.jar,文件上传 commons-logging-1.0.4.jar,日志包 fr

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 233,997
精华内容 93,598
关键字:

下步工作与下一步