soup是什么意思 toys从哪下载拜托了

The extensive application of LED lighting technology and products in some important events or projects has achieved remarkable effect. With constant
Inquire Now
Connections
Size: 367* 364* 410mmVoltage: AC220V
Power: 6.5WLuminance : ≤ 4000cd/m2
Max illumination
Inquire Now
Inquire Now
Inquire Now
Connections
Size: 30"L/15"H (orange)8"L/5"H (blue)OEM:Welcome OEM/ODM ,LOGO printing or
Inquire Now
Inquire Now
Inquire Now
Connections
Jiaozhou, Qingdao,
Shandong, China
block size 2.5x2.5cmbox size :27x13.5x5.5cmMeet EN71 and ASTM 963 standard
this plush toys are export to south karea. size14cm to 25cm。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
Inquire Now
Connection
gaomi city,
Dawon Leisure Amusement Equipment Co.,Ltd is a manufacturer who is professional in supplying children amusement equipment.Our feature products is
Inquire Now
Inquire Now
Inquire Now
Connections
Guangdong,
I recently sent an inquiry to Jason Cao for their Children's racing car /wig-wag machine/kiddy rides because my client is looking for a possible supplier. Even though he’s not able to provide a specific answer for me, he gave me his e-mail address so that he can send a quotation regarding their product. I appreciate his response and I can say that I understand him easily. I would rate his English 8 out of 10. Although we ended up not working with Dawon Leisure Amusement Equipment Co. Ltd., I’m hoping to have a good partnership with them in the future.
- Nov 24, 2014
Exciting inflatable water ball, funballs, water walkersName
Inquire Now
Inquire Now
Inquire Now
Connections
Zhengzhou,
I recently sent an inquiry to Harry and I did not receive any replies.
- Nov 21, 2014
5800MHz 1000mW TX51W Wireless Video Audio AV Sender Channels & FrequenciesCH
Connections
Sky net / groundgrid/battery bumper carvoltage:48Vpower:230Wseat:2
Inquire Now
Inquire Now
Inquire Now
Connections
Zhongshan,
I recently contacted Nancy N and I asked her about their electric bumper car steer wheel. I got the response right away and most of my questions were answered in a detailed manner. Her response was very precise and professional. She gave her email to discuss other information.
- Dec 16, 2014
I contacted Nancy N of Zhongshan Golder Credit Amusement Equipment Co. Ltd to inquire about their company’s bumper car. Surprisingly I received a response from her a few hours after I sent my inquiry. She gave a brief description about their company and she obviously knows her industry well.Nancy informed me that they offer discount for bulk order which is good to know. She even provided me her email information so she can give me more detailed information about their product.Our project has been put on hold as of the mean time but I would definitely consider working with Zhongshan Golder Credit Amusement Equipment Co. Ltd in the future.
- Nov 13, 2014
Product Details :
Inquire Now
Inquire Now
Connections
China (Mainland)
For more details about these products, please visit our website: 1 18 years manufacturer2 2 years
Inquire Now
Inquire Now
Inquire Now
Connections
Zhengzhou,
I wasn't able to receive any answers from Yu after sending her an inquiry a couple of days ago.
- Nov 19, 2014
Product Name: Outdoor playground equipment--Tropical ParkModel No: TP-A080Product Size: 850*450*420CMCapacity: 5-15Age group:
received this products,The quality is very good
- Apr 23, 2015
Forest character inflatable baby roller1.Inflatable water toy
Inquire Now
Inquire Now
Inquire Now
Connections
I did not receive any responses after sending an inquiry to Lily Guo few days ago.
- Dec 18, 2014
Detailed Product DescriptionAmusement Samba Ballooin Rides1.Rich export experience2.OEM& ODM capacity
Inquire Now
Inquire Now
Inquire Now
Connections
Zhengzhou,
- COMMERCIAL GRADE INFLATABLES that you may choose to use for commercial (rental) and/or personal use.
Inquire Now
Inquire Now
Inquire Now
Connections
1.Function:Easy to carry the aircraft , easy to remove , not easy to drop . stable and convenient.
Inquire Now
Inquire Now
Inquire Now
Connections
1.We are BUBBLE TOY manufacture2.OEM aaEN71certification.3.Strong supply
ability.4.Competitive price.5.Good
Inquire Now
Inquire Now
Inquire Now
Connections
Linyi ,Shandong province,
contact: Sophie Lv()Quick DetailsMaterial: PlushType: animalPlace of Origin: Jiangsu, China
Inquire Now
Inquire Now
Inquire Now
Connections
4 functions mini children electronic rc cars for saleSpecificationItem
Inquire Now
Inquire Now
Inquire Now
Connections
China (Mainland)
Item number: 21822Name: 1:16 rc Panther G tank model toy with sound and smoke function
Inquire Now
Inquire Now
Inquire Now
Connections
Send this inquiry to similar products
Recipient:
Invite to connect
Recently Viewed Products
12 Suppliers &
94 Products
41 Suppliers &
284 Products
11 Suppliers &
68 Products
21 Suppliers &
212 Products
25 Suppliers &
52 Products
Popular Products on Tradesparq
14 Suppliers &
65 Products
41 Suppliers &
279 Products
49 Suppliers &
360 Products
24 Suppliers &
102 Products
7 Suppliers &
98 Products
Tradesparq is a supplier/manufacturer directory of major industry Toys makers and builders/producers. Our listings are from countries worldwide including many from top rated Chinese companies.
We list many of China's best Toys manufacturers and also have a number of other good companies that supply
equipment & related supplies to dealers and distributors/vendors.
Ranking of China suppliers manufacturing Toys can be filtered by their reviews, recommendations, price/cost and overall quality rating.
Your overall rating of this company:
Click to ratetoys regulation SOR-2011-17_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
toys regulation SOR-2011-17
&&加拿大玩具法规SOR-2011-17
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩36页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢东江湾路188号A栋115
信息提供者:&&
75 人感兴趣 &
17 人要参加 &
活动讨论区
活动相关标签 &&&&&&&&&&&&
活动地图 (
活动组织者
活动成员 ( ·
链接打不开?
请点击右上角
选择"在浏览器中打开"&p&大三的时候上了一门人工智能,其中有一次作业就用到了遗传算法,问题是这样的:&/p&&div class=&highlight&&&pre&&code class=&language-text&&求解函数 f(x) = x + 10*sin(5*x) + 7*cos(4*x) 在区间[0,9]的最大值。
&/code&&/pre&&/div&&p&这个函数大概长这样:&/p&&img src=&/c461e04cdc0b8947bad5f1a47fc322e6_b.png& data-rawwidth=&1266& data-rawheight=&932& class=&origin_image zh-lightbox-thumb& width=&1266& data-original=&/c461e04cdc0b8947bad5f1a47fc322e6_r.png&&&p&&br&&/p&&p&那么如何应用遗传算法如何来找到这个奇怪的函数的最大值呢?&/p&&p&事实上,不管一个函数的形状多么奇怪,遗传算法都能在很短的时间内找到它在一个区间内的(近似)最大值。&/p&&p&相当神奇,不是吗?&/p&&p&接下来围绕这个问题,讲讲我对遗传算法的一些理解。实现代码以及在Matlab中使用遗传算法的小教程都附在最后。&/p&&p&&br&&/p&&p&&b&1.介绍&/b&&/p&&p&遗传算法(Genetic Algorithm)遵循『适者生存』、『优胜劣汰』的原则,是一类借鉴生物界自然选择和自然遗传机制的随机化搜索算法。&/p&&p&遗传算法模拟一个人工种群的进化过程,通过选择(Selection)、交叉(Crossover)以及变异(Mutation)等机制,在每次迭代中都保留一组候选个体,重复此过程,种群经过若干代进化后,理想情况下其适应度达到&b&***近似最优***&/b&的状态。&/p&&p&自从遗传算法被提出以来,其得到了广泛的应用,特别是在函数优化、生产调度、模式识别、神经网络、自适应控制等领域,遗传算法发挥了很大的作用,提高了一些问题求解的效率。&/p&&p&&br&&/p&&p&&b&2.遗传算法组成&/b&&/p&&ul&&li&编码 -& 创造染色体&/li&&li&个体 -& 种群&/li&&li&适应度函数&/li&&li&遗传算子&br&&/li&&ul&&li&选择&/li&&li&交叉&/li&&li&变异&/li&&/ul&&/ul&&p&&br&&/p&&ul&&li&运行参数&br&&/li&&ul&&li&是否选择精英操作&/li&&li&种群大小&/li&&li&染色体长度&/li&&li&最大迭代次数&/li&&li&交叉概率&/li&&li&变异概率&/li&&/ul&&/ul&&p&&br&&/p&&p&&br&&/p&&p&&b&2.1 编码与解码&/b&&/p&&p&实现遗传算法的第一步就是明确对求解问题的编码和解码方式。&/p&&p&对于函数优化问题,一般有两种编码方式,各具优缺点&/p&&ul&&li&实数编码:直接用实数表示基因,容易理解且不需要解码过程,但容易过早收敛,从而陷入局部最优&/li&&li&二进制编码:稳定性高,种群多样性大,但需要的存储空间大,需要解码且难以理解&/li&&/ul&&p&&br&&/p&&p&对于求解函数最大值问题,我选择的是二进制编码。&/p&&img src=&/6f49b2e302fbebe4d3cb1ab_b.png& data-rawwidth=&706& data-rawheight=&304& class=&origin_image zh-lightbox-thumb& width=&706& data-original=&/6f49b2e302fbebe4d3cb1ab_r.png&&&p&以我们的目标函数 &b&f(x) = x + 10sin(5x) + 7cos(4x), x∈[0,9]&/b& 为例。&/p&&p&假如设定求解的精度为小数点后4位,可以将x的解空间划分为 (9-0)×(1e+4)=90000个等分。&/p&&p&2^16&,需要17位二进制数来表示这些解。换句话说,一个解的编码就是一个17位的二进制串。&/p&&p&一开始,这些二进制串是随机生成的。&/p&&p&一个这样的二进制串代表一条染色体串,这里染色体串的长度为17。&/p&&p&对于任何一条这样的染色体chromosome,如何将它复原(解码)到[0,9]这个区间中的数值呢?&/p&&p&对于本问题,我们可以采用以下公式来解码:&/p&&div class=&highlight&&&pre&&code class=&language-text&&x = 0 + decimal(chromosome)×(9-0)/(2^17-1)
&/code&&/pre&&/div&&p&decimal( ): 将二进制数转化为十进制数&/p&&p&一般化解码公式:&/p&&div class=&highlight&&&pre&&code class=&language-text&&f(x), x∈[lower_bound, upper_bound]
x = lower_bound + decimal(chromosome)×(upper_bound-lower_bound)/(2^chromosome_size-1)
&/code&&/pre&&/div&&p&lower_bound: 函数定义域的下限&br&upper_bound: 函数定义域的上限&br&chromosome_size: 染色体的长度&/p&&p&通过上述公式,我们就可以成功地将二进制染色体串解码成[0,9]区间中的十进制实数解。&/p&&p&&b&2.2 个体与种群&/b&&/p&&p&『染色体』表达了某种特征,这种特征的载体,称为『个体』。&/p&&p&对于本次实验所要解决的一元函数最大值求解问题,个体可以用上一节构造的染色体表示,一个个体里有一条染色体。&/p&&p&许多这样的个体组成了一个种群,其含义是一个一维点集(x轴上[0,9]的线段)。&/p&&p&&b&2.3 适应度函数&/b&&/p&&p&遗传算法中,一个个体(解)的好坏用适应度函数值来评价,在本问题中,f(x)就是适应度函数。&/p&&p&适应度函数值越大,解的质量越高。&/p&&p&适应度函数是遗传算法进化的驱动力,也是进行自然选择的唯一标准,它的设计应结合求解问题本身的要求而定。&/p&&p&&b&2.4 遗传算子&/b&&/p&&p&我们希望有这样一个种群,它所包含的个体所对应的函数值都很接近于f(x)在[0,9]上的最大值,但是这个种群一开始可能不那么优秀,因为个体的染色体串是随机生成的。&/p&&p&如何让种群变得优秀呢?&/p&&p&不断的进化。&/p&&p&每一次进化都尽可能保留种群中的优秀个体,淘汰掉不理想的个体,并且在优秀个体之间进行染色体交叉,有些个体还可能出现变异。&/p&&p&种群的每一次进化,都会产生一个最优个体。种群所有世代的最优个体,可能就是函数f(x)最大值对应的定义域中的点。&/p&&p&如果种群无休止地进化,那总能找到最好的解。但实际上,我们的时间有限,通常在得到一个看上去不错的解时,便终止了进化。&/p&&p&对于给定的种群,如何赋予它&b&进化&/b&的能力呢?&/p&&ul&&li&首先是&b&选择&/b&(selection)&br&&/li&&ul&&li&选择操作是从前代种群中选择***多对***较优个体,一对较优个体称之为一对父母,让父母们将它们的基因传递到下一代,直到下一代个体数量达到种群数量上限&/li&&li&在选择操作前,将种群中个体按照适应度从小到大进行排列&/li&&li&采用轮盘赌选择方法(当然还有很多别的选择方法),各个个体被选中的概率与其适应度函数值大小成正比&/li&&li&轮盘赌选择方法具有随机性,在选择的过程中可能会丢掉较好的个体,所以可以使用精英机制,将前代最优个体直接选择&/li&&/ul&&/ul&&p&&br&&/p&&ul&&li&其次是&b&交叉&/b&(crossover)&br&&/li&&ul&&li&两个待交叉的不同的染色体(父母)根据交叉概率(cross_rate)按某种方式交换其部分基因&/li&&li&采用单点交叉法,也可以使用其他交叉方法&/li&&/ul&&/ul&&p&&br&&/p&&ul&&li&最后是&b&变异&/b&(mutation)&br&&/li&&ul&&li&染色体按照变异概率(mutate_rate)进行染色体的变异&/li&&li&采用单点变异法,也可以使用其他变异方法&/li&&/ul&&/ul&&p&&br&&/p&&p&&br&&/p&&p&一般来说,交叉概率(cross_rate)比较大,变异概率(mutate_rate)极低。像求解函数最大值这类问题,我设置的交叉概率(cross_rate)是0.6,变异概率(mutate_rate)是0.01。&/p&&p&因为遗传算法相信2条优秀的父母染色体交叉更有可能产生优秀的后代,而变异的话产生优秀后代的可能性极低,不过也有存在可能一下就变异出非常优秀的后代。这也是符合自然界生物进化的特征的。&/p&&p&&br&&/p&&p&&b&3.遗传算法流程&/b&&/p&&img src=&/bbe28bbf296e4b90bca3_b.png& data-rawwidth=&1202& data-rawheight=&1186& class=&origin_image zh-lightbox-thumb& width=&1202& data-original=&/bbe28bbf296e4b90bca3_r.png&&&p&在matlab下写了个测试程序。&br&附上代码&a href=&///?target=https%3A///yanshengjia/artificial-intelligence/tree/master/genetic-algorithm-for-functional-maximum-problem& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/yanshengjia/&/span&&span class=&invisible&&artificial-intelligence/tree/master/genetic-algorithm-for-functional-maximum-problem&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&&br&&/p&&p&测试结果&/p&&ul&&li&最优个体:11011&/li&&li&最优适应度:24.8554&/li&&li&最优个体对应自变量值:7.8569&/li&&li&达到最优结果需要的迭代次数:多次实验后发现,达到收敛的迭代次数从20次到一百多次不等&/li&&/ul&&p&&br&&/p&&p&迭代次数与平均适应度关系曲线(横轴:迭代次数,纵轴:平均适应度)&/p&&img src=&/cfea41ceb2f7face7764afe_b.png& data-rawwidth=&954& data-rawheight=&754& class=&origin_image zh-lightbox-thumb& width=&954& data-original=&/cfea41ceb2f7face7764afe_r.png&&&p&&br&&/p&&p&&br&&/p&&p&有现成的工具可以直接使用遗传算法,比如Matlab。&br&最后就再介绍一下如何在Matlab中使用遗传算法。&/p&&p&&b&在MATLAB中使用GA&/b&&/p&&p&1. 打开 Optimization 工具,在 Solver 中选择 ga - genetic algorithm,在 Fitness function 中填入 &u&@target&/u&&/p&&p&2. 在你的工程文件夹中新建 target.m,注意MATLAB的当前路径是你的工程文件夹所在路径&/p&&p&3. 在 target.m 中写下适应度函数,比如&/p&&div class=&highlight&&&pre&&code class=&language-text&&function [ y ] = target(x)
y = -x-10*sin(5*x)-7*cos(4*x);
&/code&&/pre&&/div&&p&*MATLAB中的GA只求解函数的(近似)&b&最小值&/b&,所以先要将目标函数&b&取反。&/b&&/p&&p&4. 打开 Optimization 工具,输入 变量个数(Number of variables) 和 自变量定义域(Bounds) 的值,点击 Start,遗传算法就跑起来了。最终在输出框中可以看到函数的(近似)最小值,和达到这一程度的迭代次数(Current iteration)和最终自变量的值(Final point)&/p&&p&5. 在 Optimization - ga 工具中,有许多选项。通过这些选项,可以设置下列属性&/p&&ul&&li&种群(Population)&/li&&li&选择(Selection)&/li&&li&交叉(Crossover)&/li&&li&变异(Mutation)&/li&&li&停止条件(Stopping criteria)&/li&&li&画图函数(Plot functions)&/li&&/ul&&p&&br&&/p&&p&&b&Reference&/b&&/p&&ul&&li&&a href=&///?target=http%3A///biaoyu/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Alex Yu&i class=&icon-external&&&/i&&/a& , &a href=&///?target=http%3A///biaoyu/archive//2274604.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&简单遗传算法MATLAB实现&i class=&icon-external&&&/i&&/a&&/li&&li&《机器学习》/(美)米歇尔 (Mitchell, T. M.)著;曾华军等译. —北京:机械工业出版社。&/li&&/ul&
大三的时候上了一门人工智能,其中有一次作业就用到了遗传算法,问题是这样的:求解函数 f(x) = x + 10*sin(5*x) + 7*cos(4*x) 在区间[0,9]的最大值。
这个函数大概长这样: 那么如何应用遗传算法如何来找到这个奇怪的函数的最大值呢?事实上,不管一个函数…
&a href=&///?target=https%3A///lining0806/PythonSpiderNotes& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python入门网络爬虫之精华版&i class=&icon-external&&&/i&&/a&&p&Python学习网络爬虫主要分3个大的版块:&strong&抓取&/strong&,&strong&分析&/strong&,&strong&存储&/strong&&/p&&p&另外,比较常用的爬虫框架&a href=&///?target=http%3A//scrapy.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Scrapy&i class=&icon-external&&&/i&&/a&,这里最后也详细介绍一下。&/p&&p&首先列举一下本人总结的相关文章,这些覆盖了入门网络爬虫需要的基本概念和技巧:&a href=&///?target=http%3A///category/spider/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&宁哥的小站-网络爬虫&i class=&icon-external&&&/i&&/a&&/p&&p&当我们在浏览器中输入一个url后回车,后台会发生什么?比如说你输入&a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&宁哥的小站专注数据挖掘、机器学习方向。&i class=&icon-external&&&/i&&/a&,你就会看到宁哥的小站首页。&/p&&p&简单来说这段过程发生了以下四个步骤:&/p&&ul&&li&查找域名对应的IP地址。&/li&&li&向IP对应的服务器发送请求。&/li&&li&服务器响应请求,发回网页内容。&/li&&li&浏览器解析网页内容。&/li&&/ul&&p&网络爬虫要做的,简单来说,就是实现浏览器的功能。通过指定url,直接返回给用户所需要的数据,而不需要一步步人工去操纵浏览器获取。&/p&抓取&p&这一步,你要明确要得到的内容是什么?是HTML源码,还是Json格式的字符串等。&/p&1. 最基本的抓取&p&抓取大多数情况属于get请求,即直接从对方服务器上获取数据。&/p&&p&首先,Python中自带urllib及urllib2这两个模块,基本上能满足一般的页面抓取。另外,&a href=&///?target=https%3A///kennethreitz/requests& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&requests&i class=&icon-external&&&/i&&/a&也是非常有用的包,与此类似的,还有&a href=&///?target=https%3A///jcgregorio/httplib2& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&httplib2&i class=&icon-external&&&/i&&/a&等等。&/p&&div class=&highlight&&&pre&&code class=&language-text&&Requests:
import requests
response = requests.get(url)
content = requests.get(url).content
print &response headers:&, response.headers
print &content:&, content
import urllib2
response = urllib2.urlopen(url)
content = urllib2.urlopen(url).read()
print &response headers:&, response.headers
print &content:&, content
Httplib2:
import httplib2
http = httplib2.Http()
response_headers, content = http.request(url, 'GET')
print &response headers:&, response_headers
print &content:&, content
&/code&&/pre&&/div&&p&此外,对于带有查询字段的url,get请求一般会将来请求的数据附在url之后,以?分割url和传输数据,多个参数用&连接。&/p&&div class=&highlight&&&pre&&code class=&language-text&&data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.get(url=url, params=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
full_url = url+'?'+data
response = urllib2.urlopen(full_url)
&/code&&/pre&&/div&&p&相关参考:&a href=&///?target=http%3A///%25E7%25BD%%E6%%25E9%2597%25BB%25E6%258E%%25A1%258C%25E6%25A6%259C%25E6%258A%%258F%%259B%259E%25E9%25A1%25BE/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&网易新闻排行榜抓取回顾&i class=&icon-external&&&/i&&/a&&/p&&p&参考项目:&a href=&///?target=https%3A///lining0806/PythonSpiderNotes/tree/master/NewsSpider& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&网络爬虫之最基本的爬虫:爬取网易新闻排行榜&i class=&icon-external&&&/i&&/a&&/p&2. 对于登陆情况的处理&p&&strong&2.1 使用表单登陆&/strong&&/p&&p&这种情况属于post请求,即先向服务器发送表单数据,服务器再将返回的cookie存入本地。&/p&&div class=&highlight&&&pre&&code class=&language-text&&data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.post(url=url, data=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
req = urllib2.Request(url=url, data=data)
response = urllib2.urlopen(req)
&/code&&/pre&&/div&&p&&strong&2.2 使用cookie登陆&/strong&&/p&&p&使用cookie登陆,服务器会认为你是一个已登陆的用户,所以就会返回给你一个已登陆的内容。因此,需要验证码的情况可以使用带验证码登陆的cookie解决。&/p&&div class=&highlight&&&pre&&code class=&language-text&&import requests
requests_session = requests.session()
response = requests_session.post(url=url_login, data=data)
&/code&&/pre&&/div&&p&若存在验证码,此时采用response = requests_session.post(url=url_login, data=data)是不行的,做法应该如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&response_captcha = requests_session.get(url=url_login, cookies=cookies)
response1 = requests.get(url_login) # 未登陆
response2 = requests_session.get(url_login) # 已登陆,因为之前拿到了Response Cookie!
response3 = requests_session.get(url_results) # 已登陆,因为之前拿到了Response Cookie!
&/code&&/pre&&/div&&p&相关参考:&a href=&///?target=http%3A///6-%25E7%25BD%%25BB%259C%25E7%2588%25AC%25E8%2599%25AB-%25E9%25AA%258C%25E8%25AF%%25A0%%2599%25BB%25E9%/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&网络爬虫-验证码登陆&i class=&icon-external&&&/i&&/a&&/p&&p&参考项目:&a href=&///?target=https%3A///lining0806/PythonSpiderNotes/tree/master/ZhihuSpider& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&网络爬虫之用户名密码及验证码登陆:爬取知乎网站&i class=&icon-external&&&/i&&/a&&/p&3. 对于反爬虫机制的处理&p&&strong&3.1 使用代理&/strong&&/p&&p&适用情况:限制IP地址情况,也可解决由于“频繁点击”而需要输入验证码登陆的情况。&/p&&p&这种情况最好的办法就是维护一个代理IP池,网上有很多免费的代理IP,良莠不齐,可以通过筛选找到能用的。对于“频繁点击”的情况,我们还可以通过限制爬虫访问网站的频率来避免被网站禁掉。&/p&&div class=&highlight&&&pre&&code class=&language-text&&proxies = {'http':'http://XX.XX.XX.XX:XXXX'}
Requests:
import requests
response = requests.get(url=url, proxies=proxies)
import urllib2
proxy_support = urllib2.ProxyHandler(proxies)
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
urllib2.install_opener(opener) # 安装opener,此后调用urlopen()时都会使用安装过的opener对象
response = urllib2.urlopen(url)
&/code&&/pre&&/div&&p&&strong&3.2 时间设置&/strong&&/p&&p&适用情况:限制频率情况。&/p&&p&Requests,Urllib2都可以使用time库的sleep()函数:&/p&&div class=&highlight&&&pre&&code class=&language-text&&import time
time.sleep(1)
&/code&&/pre&&/div&&p&&strong&3.3 伪装成浏览器,或者反“反盗链”&/strong&&/p&&p&有些网站会检查你是不是真的浏览器访问,还是机器自动访问的。这种情况,加上User-Agent,表明你是浏览器访问即可。有时还会检查是否带Referer信息还会检查你的Referer是否合法,一般再加上Referer。&/p&&div class=&highlight&&&pre&&code class=&language-text&&headers = {'User-Agent':'XXXXX'} # 伪装成浏览器访问,适用于拒绝爬虫的网站
headers = {'Referer':'XXXXX'}
headers = {'User-Agent':'XXXXX', 'Referer':'XXXXX'}
Requests:
response = requests.get(url=url, headers=headers)
import urllib, urllib2
req = urllib2.Request(url=url, headers=headers)
response = urllib2.urlopen(req)
&/code&&/pre&&/div&4. 对于断线重连&p&不多说。&/p&&div class=&highlight&&&pre&&code class=&language-text&&def multi_session(session, *arg):
retryTimes = 20
while retryTimes&0:
return session.post(*arg)
print '.',
retryTimes -= 1
&/code&&/pre&&/div&&p&或者&/p&&div class=&highlight&&&pre&&code class=&language-text&&def multi_open(opener, *arg):
retryTimes = 20
while retryTimes&0:
return opener.open(*arg)
print '.',
retryTimes -= 1
&/code&&/pre&&/div&&p&这样我们就可以使用multi_session或multi_open对爬虫抓取的session或opener进行保持。&/p&5. 多进程抓取&p&这里针对&a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&华尔街见闻&i class=&icon-external&&&/i&&/a&进行并行抓取的实验对比:&a href=&///?target=https%3A///lining0806/PythonSpiderNotes/tree/master/Spider_Python& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python多进程抓取&i class=&icon-external&&&/i&&/a& 与 &a href=&///?target=https%3A///lining0806/PythonSpiderNotes/tree/master/Spider_Java& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java单线程和多线程抓取&i class=&icon-external&&&/i&&/a&&/p&&p&相关参考:&a href=&///?target=http%3A///%25E5%%25E4%25BA%258Epython%25E5%Cjava%25E7%259A%%25A4%259A%25E8%25BF%259B%25E7%25A8%258B%25E5%25A4%259A%25E7%25BA%25BF%25E7%25A8%258B%25E8%25AE%25A1%25E7%25AE%%%25E6%25B3%%25AF%25B9%25E6%25AF%2594/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&关于Python和Java的多进程多线程计算方法对比&i class=&icon-external&&&/i&&/a&&/p&6. 对于Ajax请求的处理&p&对于“加载更多”情况,使用Ajax来传输很多数据。&/p&&p&它的工作原理是:从网页的url加载网页的源代码之后,会在浏览器里执行JavaScript程序。这些程序会加载更多的内容,“填充”到网页里。这就是为什么如果你直接去爬网页本身的url,你会找不到页面的实际内容。&/p&&p&这里,若使用Google Chrome分析”请求“对应的链接(方法:右键→审查元素→Network→清空,点击”加载更多“,出现对应的GET链接寻找Type为text/html的,点击,查看get参数或者复制Request URL),循环过程。&/p&&ul&&li&如果“请求”之前有页面,依据上一步的网址进行分析推导第1页。以此类推,抓取抓Ajax地址的数据。&/li&&li&对返回的json格式数据(str)进行正则匹配。json格式数据中,需从'\uxxxx'形式的unicode_escape编码转换成u'\uxxxx'的unicode编码。&/li&&/ul&7. 自动化测试工具Selenium&p&Selenium是一款自动化测试工具。它能实现操纵浏览器,包括字符填充、鼠标点击、获取元素、页面切换等一系列操作。总之,凡是浏览器能做的事,Selenium都能够做到。&/p&&p&这里列出在给定城市列表后,使用selenium来动态抓取&a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&去哪儿网&i class=&icon-external&&&/i&&/a&的票价信息的代码。&/p&&p&参考项目:&a href=&///?target=https%3A///lining0806/PythonSpiderNotes/tree/master/QunarSpider& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&网络爬虫之Selenium使用代理登陆:爬取去哪儿网站&i class=&icon-external&&&/i&&/a&&/p&8. 验证码识别&p&对于网站有验证码的情况,我们有三种办法:&/p&&ul&&li&使用代理,更新IP。&/li&&li&使用cookie登陆。&/li&&li&验证码识别。&/li&&/ul&&p&使用代理和使用cookie登陆之前已经讲过,下面讲一下验证码识别。&/p&&p&可以利用开源的Tesseract-OCR系统进行验证码图片的下载及识别,将识别的字符传到爬虫系统进行模拟登陆。当然也可以将验证码图片上传到打码平台上进行识别。如果不成功,可以再次更新验证码识别,直到成功为止。&/p&&p&参考项目:&a href=&///?target=https%3A///lining0806/PythonSpiderNotes/tree/master/Captcha1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&验证码识别项目第一版:Captcha1&i class=&icon-external&&&/i&&/a&&/p&&p&&strong&爬取有两个需要注意的问题:&/strong&&/p&&ul&&li&如何监控一系列网站的更新情况,也就是说,如何进行增量式爬取?&/li&&li&对于海量数据,如何实现分布式爬取?&/li&&/ul&分析&p&抓取之后就是对抓取的内容进行分析,你需要什么内容,就从中提炼出相关的内容来。&/p&&p&常见的分析工具有&a href=&///?target=http%3A//deerchao.net/tutorials/regex/regex.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&正则表达式&i class=&icon-external&&&/i&&/a&,&a href=&///?target=http%3A///software/BeautifulSoup/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&BeautifulSoup&i class=&icon-external&&&/i&&/a&,&a href=&///?target=http%3A//lxml.de/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&lxml&i class=&icon-external&&&/i&&/a&等等。&/p&存储&p&分析出我们需要的内容之后,接下来就是存储了。&/p&&p&我们可以选择存入文本文件,也可以选择存入&a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MySQL&i class=&icon-external&&&/i&&/a&或&a href=&///?target=https%3A//www.mongodb.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MongoDB&i class=&icon-external&&&/i&&/a&数据库等。&/p&&p&&strong&存储有两个需要注意的问题:&/strong&&/p&&ul&&li&如何进行网页去重?&/li&&li&内容以什么形式存储?&/li&&/ul&Scrapy&p&Scrapy是一个基于Twisted的开源的Python爬虫框架,在工业中应用非常广泛。&/p&&p&相关内容可以参考&a href=&///?target=http%3A///%25E5%259F%25BA%25E4%25BA%258Escrapy%25E7%25BD%%25BB%259C%25E7%2588%25AC%25E8%2599%25AB%25E7%259A%%2590%25AD%25E5%25BB%25BA/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&基于Scrapy网络爬虫的搭建&i class=&icon-external&&&/i&&/a&,同时给出这篇文章介绍的&a href=&///?target=http%3A///weixin& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&微信搜索&i class=&icon-external&&&/i&&/a&爬取的项目代码,给大家作为学习参考。&/p&&p&参考项目:&a href=&///?target=https%3A///lining0806/PythonSpiderNotes/tree/master/WechatSearchProjects& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&使用Scrapy或Requests递归抓取微信搜索结果&i class=&icon-external&&&/i&&/a&&/p&
Python学习网络爬虫主要分3个大的版块:抓取,分析,存储另外,比较常用的爬虫框架,这里最后也详细介绍一下。首先列举一下本人总结的相关文章,这些覆盖了入门网络爬虫需要的基本概念和技巧:当我们在…
电脑上长跑的程序基本没有,因为不能保证 24 小时处于开机状态,但是 VPS 上倒是跑了很多有意思的小程序。&br&&br&&b&1. 监控 1024 的贴图模块,并抓取所有新增图片&/b&&br&图片聚合到了 zhihu.photo,不过为了我的安全,我并没有将访问链接暴露出来,如果你想玩,可以自己去 fork 我的代码,并做对应的调整。&br&&ul&&li&所有代码:&a href=&///?target=https%3A///xlzd/zhihu.photo& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/xlzd/zhihu.p&/span&&span class=&invisible&&hoto&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&/li&&li&1024 爬虫代码:&a href=&///?target=https%3A///xlzd/zhihu.photo/blob/master/crawler/t66y_crawler.py& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&zhihu.photo/t66y_crawler.py at master · xlzd/zhihu.photo · GitHub&i class=&icon-external&&&/i&&/a&&/li&&/ul&&br&&br&&b&2. 微博报时&/b&&br&每个整点自动发微博报时,顺便发一张图片。&br&代码:&a href=&///?target=https%3A///xlzd/xPyToys/blob/master/weibo_baoshi.py& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&xPyToys/weibo_baoshi.py at master · xlzd/xPyToys · GitHub&i class=&icon-external&&&/i&&/a&&br&效果:&br&&img src=&/7d33fafa0d60c88ac1d02_b.png& data-rawwidth=&1194& data-rawheight=&1296& class=&origin_image zh-lightbox-thumb& width=&1194& data-original=&/7d33fafa0d60c88ac1d02_r.png&&&br&&br&&br&&br&&b&3. 通过微博控制电脑&/b&&br&发一条微博,内容为一条指令。电脑端监控我的微博,并自动执行命令,然后将结果作为评论回复到当条微博下。&br&&br&&br&&b&4. 租房网站信息监控&/b&&br&之前有段时间需要租房,所以监控了赶集、58 和豆瓣的租房信息,当目标地区、目标小区的个人房源有更新之后,就立刻发邮件通知我。&br&&br&&br&&b&5. bing 首页图片下载并自动上传七牛&/b&&br&代码:&a href=&///?target=https%3A///xlzd/xPyToys/blob/master/down_bing_bg.py& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&xPyToys/down_bing_bg.py at master · xlzd/xPyToys · GitHub&i class=&icon-external&&&/i&&/a&
电脑上长跑的程序基本没有,因为不能保证 24 小时处于开机状态,但是 VPS 上倒是跑了很多有意思的小程序。 1. 监控 1024 的贴图模块,并抓取所有新增图片 图片聚合到了 zhihu.photo,不过为了我的安全,我并没有将访问链接暴露出来,如果你想玩,可以自己去…
&p&矩阵求导的技术,在统计学、控制论、机器学习等领域有广泛的应用。鉴于我看过的一些资料或言之不详、或繁乱无绪,本文来做个科普,分作两篇,上篇讲标量对矩阵的求导术,下篇讲矩阵对矩阵的求导术。本文使用小写字母x表示标量,粗体小写字母&img src=&/equation?tex=%5Cboldsymbol%7Bx%7D+& alt=&\boldsymbol{x} & eeimg=&1&&表示向量,大写字母X表示矩阵。&/p&&p&&br&&/p&&p&首先来琢磨一下定义,标量f对矩阵X的导数,定义为&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+f%7D%7B%5Cpartial+X%7D+%3D+%5Cleft%5B%5Cfrac%7B%5Cpartial+f+%7D%7B%5Cpartial+X_%7Bij%7D%7D%5Cright%5D& alt=&\frac{\partial f}{\partial X} = \left[\frac{\partial f }{\partial X_{ij}}\right]& eeimg=&1&&,即f对X逐元素求导排成与X尺寸相同的矩阵。然而,这个定义在计算中并不好用,实用上的原因是在对较复杂的函数难以逐元素求导;哲理上的原因是逐元素求导破坏了&b&整体性&/b&。试想,为何要将f看做矩阵X而不是各元素&img src=&/equation?tex=X_%7Bij%7D& alt=&X_{ij}& eeimg=&1&&的函数呢?答案是用矩阵运算更整洁。所以在求导时不宜拆开矩阵,而是要找一个从整体出发的算法。为此,我们来回顾,一元微积分中的导数(标量对标量的导数)与微分有联系:&img src=&/equation?tex=df+%3D+f%27%28x%29dx& alt=&df = f'(x)dx& eeimg=&1&&;多元微积分中的梯度(标量对向量的导数)也与微分有联系:&img src=&/equation?tex=df+%3D+%5Csum_%7Bi%7D+%5Cfrac%7B%5Cpartial+f%7D%7B%5Cpartial+x_i%7Ddx_i+%3D+%5Cfrac%7B%5Cpartial+f%7D%7B%5Cpartial+%5Cboldsymbol%7Bx%7D%7D%5ET+d%5Cboldsymbol%7Bx%7D+& alt=&df = \sum_{i} \frac{\partial f}{\partial x_i}dx_i = \frac{\partial f}{\partial \boldsymbol{x}}^T d\boldsymbol{x} & eeimg=&1&&,这里第一个等号是全微分公式,第二个等号表达了梯度&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+f%7D%7B%5Cpartial+%5Cboldsymbol%7Bx%7D%7D& alt=&\frac{\partial f}{\partial \boldsymbol{x}}& eeimg=&1&&与微分的联系;受此启发,我们将矩阵导数与微分建立联系:&img src=&/equation?tex=df+%3D+%5Csum_%7Bi%2Cj%7D+%5Cfrac%7B%5Cpartial+f%7D%7B%5Cpartial+X_%7Bij%7D%7DdX_%7Bij%7D+%3D+%5Ctext%7Btr%7D%5Cleft%28%5Cfrac%7B%5Cpartial+f%7D%7B%5Cpartial+X%7D%5ET+dX%5Cright%29+& alt=&df = \sum_{i,j} \frac{\partial f}{\partial X_{ij}}dX_{ij} = \text{tr}\left(\frac{\partial f}{\partial X}^T dX\right) & eeimg=&1&&,这里tr代表迹(trace)是方阵对角线元素之和,满足性质:对尺寸相同的矩阵A,B,&img src=&/equation?tex=%5Ctext%7Btr%7D%28A%5ETB%29+%3D+%5Csum_%7Bi%2Cj%7DA_%7Bij%7DB_%7Bij%7D& alt=&\text{tr}(A^TB) = \sum_{i,j}A_{ij}B_{ij}& eeimg=&1&&,即&img src=&/equation?tex=%5Ctext%7Btr%7D%28A%5ETB%29& alt=&\text{tr}(A^TB)& eeimg=&1&&是矩阵A,B的&b&内积&/b&,因此上式与原定义相容。&/p&&p&&br&&/p&&p&然后来建立运算法则。回想遇到较复杂的一元函数如&img src=&/equation?tex=f+%3D+%5Clog%282%2B%5Csin+x%29e%5E%7B%5Csqrt%7Bx%7D%7D& alt=&f = \log(2+\sin x)e^{\sqrt{x}}& eeimg=&1&&,我们是如何求导的呢?通常不是从定义开始求极限,而是先建立了初等函数求导和四则运算、复合等法则,再来运用这些法则。故而,我们来创立常用的矩阵微分的运算法则:&/p&&ol&&li&加减法:&img src=&/equation?tex=d%28X%5Cpm+Y%29+%3D+dX+%5Cpm+dY& alt=&d(X\pm Y) = dX \pm dY& eeimg=&1&&;矩阵乘法:&img src=&/equation?tex=d%28XY%29+%3D+dX+Y+%2B+X+dY+& alt=&d(XY) = dX Y + X dY & eeimg=&1&&;转置:&img src=&/equation?tex=d%28X%5ET%29+%3D+%28dX%29%5ET& alt=&d(X^T) = (dX)^T& eeimg=&1&&;迹:&img src=&/equation?tex=d%5Ctext%7Btr%7D%28X%29+%3D+%5Ctext%7Btr%7D%28dX%29& alt=&d\text{tr}(X) = \text{tr}(dX)& eeimg=&1&&。&/li&&li&逆:&img src=&/equation?tex=dX%5E%7B-1%7D+%3D+-X%5E%7B-1%7DdX+X%5E%7B-1%7D& alt=&dX^{-1} = -X^{-1}dX X^{-1}& eeimg=&1&&。此式可在&img src=&/equation?tex=XX%5E%7B-1%7D%3DI& alt=&XX^{-1}=I& eeimg=&1&&两侧求微分来证明。&/li&&li&行列式:&img src=&/equation?tex=d%7CX%7C+%3D+%5Ctext%7Btr%7D%28X%5E%7B%5C%23%7DdX%29+& alt=&d|X| = \text{tr}(X^{\#}dX) & eeimg=&1&&,其中&img src=&/equation?tex=X%5E%7B%5C%23%7D& alt=&X^{\#}& eeimg=&1&&表示X的伴随矩阵,在X可逆时又可以写作&img src=&/equation?tex=d%7CX%7C%3D+%7CX%7C%5Ctext%7Btr%7D%28X%5E%7B-1%7DdX%29& alt=&d|X|= |X|\text{tr}(X^{-1}dX)& eeimg=&1&&。此式可用Laplace展开来证明,详见张贤达《矩阵分析与应用》第279页。&/li&&li&逐元素乘法:&img src=&/equation?tex=d%28X%5Codot+Y%29+%3D+dX%5Codot+Y+%2B+X%5Codot+dY& alt=&d(X\odot Y) = dX\odot Y + X\odot dY& eeimg=&1&&,&img src=&/equation?tex=%5Codot& alt=&\odot& eeimg=&1&&表示尺寸相同的矩阵X,Y逐元素相乘。&/li&&li&逐元素函数:&img src=&/equation?tex=d%5Csigma%28X%29+%3D+%5Csigma%27%28X%29%5Codot+dX+& alt=&d\sigma(X) = \sigma'(X)\odot dX & eeimg=&1&&,&img src=&/equation?tex=%5Csigma%28X%29+%3D+%5Cleft%5B%5Csigma%28X_%7Bij%7D%29%5Cright%5D& alt=&\sigma(X) = \left[\sigma(X_{ij})\right]& eeimg=&1&&是逐元素运算的标量函数。&/li&&/ol&&p&&br&&/p&&p&我们试图利用矩阵导数与微分的联系&img src=&/equation?tex=df+%3D+%5Ctext%7Btr%7D%5Cleft%28%5Cfrac%7B%5Cpartial+f%7D%7B%5Cpartial+X%7D%5ET+dX%5Cright%29+& alt=&df = \text{tr}\left(\frac{\partial f}{\partial X}^T dX\right) & eeimg=&1&&,在求出左侧的微分&img src=&/equation?tex=df& alt=&df& eeimg=&1&&后,该如何写成右侧的形式并得到导数呢?这需要一些迹技巧(trace trick):&/p&&ol&&li&标量套上迹:&img src=&/equation?tex=a+%3D+%5Ctext%7Btr%7D%28a%29& alt=&a = \text{tr}(a)& eeimg=&1&&&/li&&li&转置:&img src=&/equation?tex=%5Cmathrm%7Btr%7D%28A%5ET%29+%3D+%5Cmathrm%7Btr%7D%28A%29& alt=&\mathrm{tr}(A^T) = \mathrm{tr}(A)& eeimg=&1&&。&/li&&li&线性:&img src=&/equation?tex=%5Ctext%7Btr%7D%28A%5Cpm+B%29+%3D+%5Ctext%7Btr%7D%28A%29%5Cpm+%5Ctext%7Btr%7D%28B%29& alt=&\text{tr}(A\pm B) = \text{tr}(A)\pm \text{tr}(B)& eeimg=&1&&。&/li&&li&矩阵乘法交换:&img src=&/equation?tex=%5Ctext%7Btr%7D%28AB%29+%3D+%5Ctext%7Btr%7D%28BA%29& alt=&\text{tr}(AB) = \text{tr}(BA)& eeimg=&1&&。两侧都等于&img src=&/equation?tex=%5Csum_%7Bi%2Cj%7DA_%7Bij%7DB_%7Bji%7D& alt=&\sum_{i,j}A_{ij}B_{ji}& eeimg=&1&&。&/li&&li&矩阵乘法/逐元素乘法交换:&img src=&/equation?tex=%5Ctext%7Btr%7D%28A%5ET%28B%5Codot+C%29%29+%3D+%5Ctext%7Btr%7D%28%28A%5Codot+B%29%5ETC%29& alt=&\text{tr}(A^T(B\odot C)) = \text{tr}((A\odot B)^TC)& eeimg=&1&&。两侧都等于&img src=&/equation?tex=%5Csum_%7Bi%2Cj%7DA_%7Bij%7DB_%7Bij%7DC_%7Bij%7D& alt=&\sum_{i,j}A_{ij}B_{ij}C_{ij}& eeimg=&1&&。&/li&&/ol&&p&&br&&/p&&p&观察一下可以断言,&b&若标量函数f是矩阵X经加减乘法、行列式、逆、逐元素函数等运算构成,则使用相应的运算法则对f求微分,再使用迹技巧给df套上迹并将其它项交换至dX左侧,即能得到导数。&/b&&/p&&p&&br&&/p&&p&在建立法则的最后,来谈一谈复合:假设已求得&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+f%7D%7B%5Cpartial+Y%7D& alt=&\frac{\partial f}{\partial Y}& eeimg=&1&&,而Y是X的函数,如何求&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+f%7D%7B%5Cpartial+X%7D& alt=&\frac{\partial f}{\partial X}& eeimg=&1&&呢?在微积分中有标量求导的链式法则&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+f%7D%7B%5Cpartial+x%7D+%3D+%5Cfrac%7B%5Cpartial+f%7D%7B%5Cpartial+y%7D+%5Cfrac%7B%5Cpartial+y%7D%7B%5Cpartial+x%7D& alt=&\frac{\partial f}{\partial x} = \frac{\partial f}{\partial y} \frac{\partial y}{\partial x}& eeimg=&1&&,但这里我们不能沿用链式法则,因为矩阵对矩阵的导数&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+Y%7D%7B%5Cpartial+X%7D& alt=&\frac{\partial Y}{\partial X}& eeimg=&1&&截至目前仍是未定义的。于是我们继续追本溯源,链式法则是从何而来?源头仍然是微分。我们直接从微分入手建立复合法则:先写出&img src=&/equation?tex=df+%3D+%5Ctext%7Btr%7D%5Cleft%28%5Cfrac%7B%5Cpartial+f%7D%7B%5Cpartial+Y%7D%5ET+dY%5Cright%29& alt=&df = \text{tr}\left(\frac{\partial f}{\partial Y}^T dY\right)& eeimg=&1&&,再将dY用dX表示出来代入,并使用迹技巧将其他项交换至dX左侧,即可得到&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+f%7D%7B%5Cpartial+X%7D& alt=&\frac{\partial f}{\partial X}& eeimg=&1&&。&/p&&p&&br&&/p&&p&接下来演示一些算例。特别提醒要依据已经建立的运算法则来计算,不能随意套用微积分中标量导数的结论,比如认为AX对X的导数为A,这是没有根据、意义不明的。&/p&&p&例1:&img src=&/equation?tex=f+%3D+%5Cboldsymbol%7Ba%7D%5ET+X%5Cboldsymbol%7Bb%7D& alt=&f = \boldsymbol{a}^T X\boldsymbol{b}& eeimg=&1&&,求&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+f%7D%7B%5Cpartial+X%7D& alt=&\frac{\partial f}{\partial X}& eeimg=&1&&。&/p&&p&解:先使用矩阵乘法法则求微分:&img src=&/equation?tex=df+%3D+%5Cboldsymbol%7Ba%7D%5ET+dX%5Cboldsymbol%7Bb%7D+& alt=&df = \boldsymbol{a}^T dX\boldsymbol{b} & eeimg=&1&&,再套上迹并做交换:&img src=&/equation?tex=df+%3D+%5Ctext%7Btr%7D%28%5Cboldsymbol%7Ba%7D%5ETdX%5Cboldsymbol%7Bb%7D%29+%3D+%5Ctext%7Btr%7D%28%5Cboldsymbol%7Bb%7D%5Cboldsymbol%7Ba%7D%5ETdX%29& alt=&df = \text{tr}(\boldsymbol{a}^TdX\boldsymbol{b}) = \text{tr}(\boldsymbol{b}\boldsymbol{a}^TdX)& eeimg=&1&&,对照导数与微分的联系,得到&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+f%7D%7B%5Cpartial+X%7D+%3D+%5Cboldsymbol%7Ba%7D%5Cboldsymbol%7Bb%7D%5ET& alt=&\frac{\partial f}{\partial X} = \boldsymbol{a}\boldsymbol{b}^T& eeimg=&1&&。&/p&&p&注意:这里不能用&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+f%7D%7B%5Cpartial+X%7D+%3D%5Cboldsymbol%7Ba%7D%5ET+%5Cfrac%7B%5Cpartial+X%7D%7B%5Cpartial+X%7D%5Cboldsymbol%7Bb%7D%3D%3F& alt=&\frac{\partial f}{\partial X} =\boldsymbol{a}^T \frac{\partial X}{\partial X}\boldsymbol{b}=?& eeimg=&1&&,导数与乘常数矩阵的交换是不合法则的运算(而微分是合法的)。有些资料在计算矩阵导数时,会略过求微分这一步,这是逻辑上解释不通的。&/p&&p&&br&&/p&&p&例2【线性回归】:&img src=&/equation?tex=l+%3D+%5C%7CX%5Cboldsymbol%7Bw%7D-+%5Cboldsymbol%7By%7D%5C%7C%5E2& alt=&l = \|X\boldsymbol{w}- \boldsymbol{y}\|^2& eeimg=&1&&,求&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial+%5Cboldsymbol%7Bw%7D%7D& alt=&\frac{\partial l}{\partial \boldsymbol{w}}& eeimg=&1&&。&/p&&p&解:严格来说这是标量对向量的导数,不过可以把向量看做矩阵的特例。将向量范数写成&img src=&/equation?tex=l+%3D+%28X%5Cboldsymbol%7Bw%7D-+%5Cboldsymbol%7By%7D%29%5ET%28X%5Cboldsymbol%7Bw%7D-+%5Cboldsymbol%7By%7D%29& alt=&l = (X\boldsymbol{w}- \boldsymbol{y})^T(X\boldsymbol{w}- \boldsymbol{y})& eeimg=&1&&,求微分,使用矩阵乘法、转置等法则:&img src=&/equation?tex=dl+%3D+%28Xd%5Cboldsymbol%7Bw%7D%29%5ET%28X%5Cboldsymbol%7Bw%7D-%5Cboldsymbol%7By%7D%29%2B%28X%5Cboldsymbol%7Bw%7D-%5Cboldsymbol%7By%7D%29%5ET%28Xd%5Cboldsymbol%7Bw%7D%29+%3D+2%28X%5Cboldsymbol%7Bw%7D-%5Cboldsymbol%7By%7D%29%5ETXd%5Cboldsymbol%7Bw%7D& alt=&dl = (Xd\boldsymbol{w})^T(X\boldsymbol{w}-\boldsymbol{y})+(X\boldsymbol{w}-\boldsymbol{y})^T(Xd\boldsymbol{w}) = 2(X\boldsymbol{w}-\boldsymbol{y})^TXd\boldsymbol{w}& eeimg=&1&&。对照导数与微分的联系,得到&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial+%5Cboldsymbol%7Bw%7D%7D%3D+2X%5ET%28X%5Cboldsymbol%7Bw%7D-%5Cboldsymbol%7By%7D%29& alt=&\frac{\partial l}{\partial \boldsymbol{w}}= 2X^T(X\boldsymbol{w}-\boldsymbol{y})& eeimg=&1&&。&/p&&p&&br&&/p&&p&例3【多元logistic回归】:&img src=&/equation?tex=l+%3D+-%5Cboldsymbol%7By%7D%5ET%5Clog%5Ctext%7Bsoftmax%7D%28W%5Cboldsymbol%7Bx%7D%29& alt=&l = -\boldsymbol{y}^T\log\text{softmax}(W\boldsymbol{x})& eeimg=&1&&,求&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial+W%7D& alt=&\frac{\partial l}{\partial W}& eeimg=&1&&。其中&img src=&/equation?tex=%5Cboldsymbol%7By%7D& alt=&\boldsymbol{y}& eeimg=&1&&是除一个元素为1外其它元素为0的向量;&img src=&/equation?tex=%5Ctext%7Bsoftmax%7D%28%5Cboldsymbol%7Ba%7D%29+%3D+%5Cfrac%7B%5Cexp%28%5Cboldsymbol%7Ba%7D%29%7D%7B%5Cboldsymbol%7B1%7D%5ET%5Cexp%28%5Cboldsymbol%7Ba%7D%29%7D& alt=&\text{softmax}(\boldsymbol{a}) = \frac{\exp(\boldsymbol{a})}{\boldsymbol{1}^T\exp(\boldsymbol{a})}& eeimg=&1&&,其中&img src=&/equation?tex=%5Cexp%28%5Cboldsymbol%7Ba%7D%29& alt=&\exp(\boldsymbol{a})& eeimg=&1&&表示逐元素求指数,&img src=&/equation?tex=%5Cboldsymbol%7B1%7D& alt=&\boldsymbol{1}& eeimg=&1&&代表全1向量。&br&&/p&&p&解:首先将softmax函数代入并写成&img src=&/equation?tex=l+%3D+-%5Cboldsymbol%7By%7D%5ET+%5Cleft%28%5Clog+%28%5Cexp%28W%5Cboldsymbol%7Bx%7D%29%29-%5Cboldsymbol%7B1%7D%5Clog%28%5Cboldsymbol%7B1%7D%5ET%5Cexp%28W%5Cboldsymbol%7Bx%7D%29%29%5Cright%29+%3D+-%5Cboldsymbol%7By%7D%5ETW%5Cboldsymbol%7Bx%7D+%2B+%5Clog%28%5Cboldsymbol%7B1%7D%5ET%5Cexp%28W%5Cboldsymbol%7Bx%7D%29%29& alt=&l = -\boldsymbol{y}^T \left(\log (\exp(W\boldsymbol{x}))-\boldsymbol{1}\log(\boldsymbol{1}^T\exp(W\boldsymbol{x}))\right) = -\boldsymbol{y}^TW\boldsymbol{x} + \log(\boldsymbol{1}^T\exp(W\boldsymbol{x}))& eeimg=&1&&,这里要注意逐元素log满足等式&img src=&/equation?tex=%5Clog%28%5Cboldsymbol%7Bu%7D%2Fc%29+%3D+%5Clog%28%5Cboldsymbol%7Bu%7D%29+-+%5Cboldsymbol%7B1%7D%5Clog%28c%29& alt=&\log(\boldsymbol{u}/c) = \log(\boldsymbol{u}) - \boldsymbol{1}\log(c)& eeimg=&1&&,以及&img src=&/equation?tex=%5Cboldsymbol%7By%7D& alt=&\boldsymbol{y}& eeimg=&1&&满足&img src=&/equation?tex=%5Cboldsymbol%7By%7D%5ET+%5Cboldsymbol%7B1%7D+%3D+1& alt=&\boldsymbol{y}^T \boldsymbol{1} = 1& eeimg=&1&&。求微分,使用矩阵乘法、逐元素函数等法则:&img src=&/equation?tex=dl+%3D-+%5Cboldsymbol%7By%7D%5ETdW%5Cboldsymbol%7Bx%7D%2B%5Cfrac%7B%5Cboldsymbol%7B1%7D%5ET%5Cleft%28%5Cexp%28W%5Cboldsymbol%7Bx%7D%29%5Codot%28dW%5Cboldsymbol%7Bx%7D%29%5Cright%29%7D%7B%5Cboldsymbol%7B1%7D%5ET%5Cexp%28W%5Cboldsymbol%7Bx%7D%29%7D& alt=&dl =- \boldsymbol{y}^TdW\boldsymbol{x}+\frac{\boldsymbol{1}^T\left(\exp(W\boldsymbol{x})\odot(dW\boldsymbol{x})\right)}{\boldsymbol{1}^T\exp(W\boldsymbol{x})}& eeimg=&1&&。再套上迹并做交换,注意可化简&img src=&/equation?tex=%5Cboldsymbol%7B1%7D%5ET%5Cleft%28%5Cexp%28W%5Cboldsymbol%7Bx%7D%29%5Codot%28dW%5Cboldsymbol%7Bx%7D%29%5Cright%29+%3D+%5Cexp%28W%5Cboldsymbol%7Bx%7D%29%5ETdW%5Cboldsymbol%7Bx%7D& alt=&\boldsymbol{1}^T\left(\exp(W\boldsymbol{x})\odot(dW\boldsymbol{x})\right) = \exp(W\boldsymbol{x})^TdW\boldsymbol{x}& eeimg=&1&&,这是根据等式&img src=&/equation?tex=%5Cboldsymbol%7B1%7D%5ET+%28%5Cboldsymbol%7Bu%7D%5Codot+%5Cboldsymbol%7Bv%7D%29+%3D+%5Cboldsymbol%7Bu%7D%5ET+%5Cboldsymbol%7Bv%7D& alt=&\boldsymbol{1}^T (\boldsymbol{u}\odot \boldsymbol{v}) = \boldsymbol{u}^T \boldsymbol{v}& eeimg=&1&&,故&img src=&/equation?tex=dl+%3D+%5Ctext%7Btr%7D%5Cleft%28-%5Cboldsymbol%7By%7D%5ETdW%5Cboldsymbol%7Bx%7D%2B%5Cfrac%7B%5Cexp%28W%5Cboldsymbol%7Bx%7D%29%5ETdW%5Cboldsymbol%7Bx%7D%7D%7B%5Cboldsymbol%7B1%7D%5ET%5Cexp%28W%5Cboldsymbol%7Bx%7D%29%7D%5Cright%29+%3D%5Ctext%7Btr%7D%28%5Cboldsymbol%7Bx%7D%28%5Ctext%7Bsoftmax%7D%28W%5Cboldsymbol%7Bx%7D%29-%5Cboldsymbol%7By%7D%29%5ETdW%29& alt=&dl = \text{tr}\left(-\boldsymbol{y}^TdW\boldsymbol{x}+\frac{\exp(W\boldsymbol{x})^TdW\boldsymbol{x}}{\boldsymbol{1}^T\exp(W\boldsymbol{x})}\right) =\text{tr}(\boldsymbol{x}(\text{softmax}(W\boldsymbol{x})-\boldsymbol{y})^TdW)& eeimg=&1&&。对照导数与微分的联系,得到&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial+W%7D%3D+%28%5Ctext%7Bsoftmax%7D%28W%5Cboldsymbol%7Bx%7D%29-%5Cboldsymbol%7By%7D%29%5Cboldsymbol%7Bx%7D%5ET& alt=&\frac{\partial l}{\partial W}= (\text{softmax}(W\boldsymbol{x})-\boldsymbol{y})\boldsymbol{x}^T& eeimg=&1&&。&/p&&p&另解:定义&img src=&/equation?tex=%5Cboldsymbol%7Ba%7D+%3D+W%5Cboldsymbol%7Bx%7D& alt=&\boldsymbol{a} = W\boldsymbol{x}& eeimg=&1&&,则&img src=&/equation?tex=l+%3D+-%5Cboldsymbol%7By%7D%5ET%5Clog%5Ctext%7Bsoftmax%7D%28%5Cboldsymbol%7Ba%7D%29+& alt=&l = -\boldsymbol{y}^T\log\text{softmax}(\boldsymbol{a}) & eeimg=&1&&,先如上求出&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial+%5Cboldsymbol%7Ba%7D%7D+%3D+%5Ctext%7Bsoftmax%7D%28%5Cboldsymbol%7Ba%7D%29-%5Cboldsymbol%7By%7D+& alt=&\frac{\partial l}{\partial \boldsymbol{a}} = \text{softmax}(\boldsymbol{a})-\boldsymbol{y} & eeimg=&1&&,再利用复合法则:&img src=&/equation?tex=dl+%3D+%5Ctext%7Btr%7D%5Cleft%28%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial+%5Cboldsymbol%7Ba%7D%7D%5ETd%5Cboldsymbol%7Ba%7D%5Cright%29+%3D+%5Ctext%7Btr%7D%5Cleft%28%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial+%5Cboldsymbol%7Ba%7D%7D%5ETdW+%5Cboldsymbol%7Bx%7D%5Cright%29+%3D+%5Ctext%7Btr%7D%5Cleft%28%5Cboldsymbol%7Bx%7D%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial+%5Cboldsymbol%7Ba%7D%7D%5ETdW%5Cright%29& alt=&dl = \text{tr}\left(\frac{\partial l}{\partial \boldsymbol{a}}^Td\boldsymbol{a}\right) = \text{tr}\left(\frac{\partial l}{\partial \boldsymbol{a}}^TdW \boldsymbol{x}\right) = \text{tr}\left(\boldsymbol{x}\frac{\partial l}{\partial \boldsymbol{a}}^TdW\right)& eeimg=&1&&,得到&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial+W%7D%3D+%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial%5Cboldsymbol%7Ba%7D%7D%5Cboldsymbol%7Bx%7D%5ET& alt=&\frac{\partial l}{\partial W}= \frac{\partial l}{\partial\boldsymbol{a}}\boldsymbol{x}^T& eeimg=&1&&。&/p&&p&&br&&/p&&p&例4【方差的最大似然估计】:样本&img src=&/equation?tex=%5Cboldsymbol%7Bx%7D_1%2C%5Cdots%2C+%5Cboldsymbol%7Bx%7D_n%5Csim+N%28%5Cboldsymbol%7B%5Cmu%7D%2C+%5CSigma%29& alt=&\boldsymbol{x}_1,\dots, \boldsymbol{x}_n\sim N(\boldsymbol{\mu}, \Sigma)& eeimg=&1&&,其中&img src=&/equation?tex=%5CSigma& alt=&\Sigma& eeimg=&1&&是对称正定矩阵,求方差&img src=&/equation?tex=%5CSigma& alt=&\Sigma& eeimg=&1&&的最大似然估计。写成数学式是:&img src=&/equation?tex=l+%3D+%5Clog%7C%5CSigma%7C%2B%5Cfrac%7B1%7D%7Bn%7D%5Csum_%7Bi%3D1%7D%5En%28%5Cboldsymbol%7Bx%7D_i-%5Cboldsymbol%7B%5Cbar%7Bx%7D%7D%29%5ET%5CSigma%5E%7B-1%7D%28%5Cboldsymbol%7Bx%7D_i-%5Cboldsymbol%7B%5Cbar%7Bx%7D%7D%29& alt=&l = \log|\Sigma|+\frac{1}{n}\sum_{i=1}^n(\boldsymbol{x}_i-\boldsymbol{\bar{x}})^T\Sigma^{-1}(\boldsymbol{x}_i-\boldsymbol{\bar{x}})& eeimg=&1&&,求&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+l+%7D%7B%5Cpartial+%5CSigma%7D& alt=&\frac{\partial l }{\partial \Sigma}& eeimg=&1&&的零点。&/p&&p&解:首先求微分,使用矩阵乘法、行列式、逆等运算法则,第一项是&img src=&/equation?tex=d%5Clog%7C%5CSigma%7C+%3D+%7C%5CSigma%7C%5E%7B-1%7Dd%7C%5CSigma%7C+%3D+%5Ctext%7Btr%7D%28%5CSigma%5E%7B-1%7Dd%5CSigma%29& alt=&d\log|\Sigma| = |\Sigma|^{-1}d|\Sigma| = \text{tr}(\Sigma^{-1}d\Sigma)& eeimg=&1&&,第二项是&img src=&/equation?tex=%5Cfrac%7B1%7D%7Bn%7D%5Csum_%7Bi%3D1%7D%5En%28%5Cboldsymbol%7Bx%7D_i-%5Cboldsymbol%7B%5Cbar%7Bx%7D%7D%29%5ETd%5CSigma%5E%7B-1%7D%28%5Cboldsymbol%7Bx%7D_i-%5Cboldsymbol%7B%5Cbar%7Bx%7D%7D%29+%3D+-%5Cfrac%7B1%7D%7Bn%7D%5Csum_%7Bi%3D1%7D%5En%28%5Cboldsymbol%7Bx%7D_i-%5Cboldsymbol%7B%5Cbar%7Bx%7D%7D%29%5ET%5CSigma%5E%7B-1%7Dd%5CSigma%5CSigma%5E%7B-1%7D%28%5Cboldsymbol%7Bx%7D_i-%5Cboldsymbol%7B%5Cbar%7Bx%7D%7D%29& alt=&\frac{1}{n}\sum_{i=1}^n(\boldsymbol{x}_i-\boldsymbol{\bar{x}})^Td\Sigma^{-1}(\boldsymbol{x}_i-\boldsymbol{\bar{x}}) = -\frac{1}{n}\sum_{i=1}^n(\boldsymbol{x}_i-\boldsymbol{\bar{x}})^T\Sigma^{-1}d\Sigma\Sigma^{-1}(\boldsymbol{x}_i-\boldsymbol{\bar{x}})& eeimg=&1&&。再给第二项套上迹做交换:&img src=&/equation?tex=dl+%3D+%5Ctext%7Btr%7D%5Cleft%28%5Cleft%28%5CSigma%5E%7B-1%7D-%5CSigma%5E%7B-1%7DS%5CSigma%5E%7B-1%7D%5Cright%29d%5CSigma%5Cright%29& alt=&dl = \text{tr}\left(\left(\Sigma^{-1}-\Sigma^{-1}S\Sigma^{-1}\right)d\Sigma\right)& eeimg=&1&&,其中&img src=&/equation?tex=S+%3D+%5Cfrac%7B1%7D%7Bn%7D%5Csum_%7Bi%3D1%7D%5En%28%5Cboldsymbol%7Bx%7D_i-%5Cboldsymbol%7B%5Cbar%7Bx%7D%7D%29%28%5Cboldsymbol%7Bx%7D_i-%5Cboldsymbol%7B%5Cbar%7Bx%7D%7D%29%5ET& alt=&S = \frac{1}{n}\sum_{i=1}^n(\boldsymbol{x}_i-\boldsymbol{\bar{x}})(\boldsymbol{x}_i-\boldsymbol{\bar{x}})^T& eeimg=&1&&定义为样本方差。对照导数与微分的联系,有&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+l+%7D%7B%5Cpartial+%5CSigma%7D%3D%28%5CSigma%5E%7B-1%7D-%5CSigma%5E%7B-1%7DS%5CSigma%5E%7B-1%7D%29%5ET& alt=&\frac{\partial l }{\partial \Sigma}=(\Sigma^{-1}-\Sigma^{-1}S\Sigma^{-1})^T& eeimg=&1&&,其零点即&img src=&/equation?tex=%5CSigma& alt=&\Sigma& eeimg=&1&&的最大似然估计为&img src=&/equation?tex=%5CSigma+%3D+S& alt=&\Sigma = S& eeimg=&1&&。&/p&&p&&br&&/p&&p&最后一例留给经典的神经网络。神经网络的求导术是学术史上的重要成果,还有个专门的名字叫做BP算法,我相信如今很多人在初次推导BP算法时也会颇费一番脑筋,事实上使用矩阵求导术来推导并不复杂。为简化起见,我们推导二层神经网络的BP算法。&/p&&p&例5【二层神经网络】:&img src=&/equation?tex=l+%3D+-%5Cboldsymbol%7By%7D%5ET%5Clog%5Ctext%7Bsoftmax%7D%28W_2%5Csigma%28W_1%5Cboldsymbol%7Bx%7D%29%29& alt=&l = -\boldsymbol{y}^T\log\text{softmax}(W_2\sigma(W_1\boldsymbol{x}))& eeimg=&1&&,求&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial+W_1%7D& alt=&\frac{\partial l}{\partial W_1}& eeimg=&1&&和&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial+W_2%7D& alt=&\frac{\partial l}{\partial W_2}& eeimg=&1&&。其中&img src=&/equation?tex=%5Cboldsymbol%7By%7D& alt=&\boldsymbol{y}& eeimg=&1&&是除一个元素为1外其它元素为0的向量,&img src=&/equation?tex=%5Ctext%7Bsoftmax%7D%28%5Cboldsymbol%7Ba%7D%29+%3D+%5Cfrac%7B%5Cexp%28%5Cboldsymbol%7Ba%7D%29%7D%7B%5Cboldsymbol%7B1%7D%5ET%5Cexp%28%5Cboldsymbol%7Ba%7D%29%7D& alt=&\text{softmax}(\boldsymbol{a}) = \frac{\exp(\boldsymbol{a})}{\boldsymbol{1}^T\exp(\boldsymbol{a})}& eeimg=&1&&同例3,&img src=&/equation?tex=%5Csigma%28%5Ccdot%29& alt=&\sigma(\cdot)& eeimg=&1&&是逐元素sigmoid函数&img src=&/equation?tex=%5Csigma%28a%29+%3D+%5Cfrac%7B1%7D%7B1%2B%5Cexp%28-a%29%7D& alt=&\sigma(a) = \frac{1}{1+\exp(-a)}& eeimg=&1&&。&/p&&p&解:定义&img src=&/equation?tex=%5Cboldsymbol%7Ba%7D_1%3DW_1%5Cboldsymbol%7Bx%7D& alt=&\boldsymbol{a}_1=W_1\boldsymbol{x}& eeimg=&1&&,&img src=&/equation?tex=%5Cboldsymbol%7Bh%7D_1+%3D+%5Csigma%28%5Cboldsymbol%7Ba%7D_1%29& alt=&\boldsymbol{h}_1 = \sigma(\boldsymbol{a}_1)& eeimg=&1&&,&img src=&/equation?tex=%5Cboldsymbol%7Ba%7D_2+%3D+W_2+%5Cboldsymbol%7Bh%7D_1& alt=&\boldsymbol{a}_2 = W_2 \boldsymbol{h}_1& eeimg=&1&&,则&img src=&/equation?tex=l+%3D-%5Cboldsymbol%7By%7D%5ET%5Clog%5Ctext%7Bsoftmax%7D%28%5Cboldsymbol%7Ba%7D_2%29& alt=&l =-\boldsymbol{y}^T\log\text{softmax}(\boldsymbol{a}_2)& eeimg=&1&&。在例3中已求出&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial+%5Cboldsymbol%7Ba%7D_2%7D+%3D+%5Ctext%7Bsoftmax%7D%28%5Cboldsymbol%7Ba%7D_2%29-%5Cboldsymbol%7By%7D+& alt=&\frac{\partial l}{\partial \boldsymbol{a}_2} = \text{softmax}(\boldsymbol{a}_2)-\boldsymbol{y} & eeimg=&1&&。使用复合法则,注意此处&img src=&/equation?tex=%5Cboldsymbol%7Bh%7D_1%2C+W_2& alt=&\boldsymbol{h}_1, W_2& eeimg=&1&&都是变量:&img src=&/equation?tex=dl+%3D+%5Ctext%7Btr%7D%5Cleft%28%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial+%5Cboldsymbol%7Ba%7D_2%7D%5ETd%5Cboldsymbol%7Ba%7D_2%5Cright%29+%3D+%5Ctext%7Btr%7D%5Cleft%28%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial+%5Cboldsymbol%7Ba%7D_2%7D%5ETdW_2+%5Cboldsymbol%7Bh%7D_1%5Cright%29+%2B+%5Ctext%7Btr%7D%5Cleft%28%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial+%5Cboldsymbol%7Ba%7D_2%7D%5ETW_2+d%5Cboldsymbol%7Bh%7D_1%5Cright%29& alt=&dl = \text{tr}\left(\frac{\partial l}{\partial \boldsymbol{a}_2}^Td\boldsymbol{a}_2\right) = \text{tr}\left(\frac{\partial l}{\partial \boldsymbol{a}_2}^TdW_2 \boldsymbol{h}_1\right) + \text{tr}\left(\frac{\partial l}{\partial \boldsymbol{a}_2}^TW_2 d\boldsymbol{h}_1\right)& eeimg=&1&&,使用矩阵乘法交换的迹技巧从第一项得到&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial+W_2%7D%3D+%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial%5Cboldsymbol%7Ba%7D_2%7D%5Cboldsymbol%7Bh%7D_1%5ET& alt=&\frac{\partial l}{\partial W_2}= \frac{\partial l}{\partial\boldsymbol{a}_2}\boldsymbol{h}_1^T& eeimg=&1&&,从第二项得到&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial+%5Cboldsymbol%7Bh%7D_1%7D%3D+W_2%5ET%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial%5Cboldsymbol%7Ba%7D_2%7D& alt=&\frac{\partial l}{\partial \boldsymbol{h}_1}= W_2^T\frac{\partial l}{\partial\boldsymbol{a}_2}& eeimg=&1&&。接下来求&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial+%5Cboldsymbol%7Ba%7D_1%7D& alt=&\frac{\partial l}{\partial \boldsymbol{a}_1}& eeimg=&1&&,继续使用复合法则,并利用矩阵乘法和逐元素乘法交换的迹技巧:&img src=&/equation?tex=%5Ctext%7Btr%7D%5Cleft%28%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial%5Cboldsymbol%7Bh%7D_1%7D%5ETd%5Cboldsymbol%7Bh%7D_1%5Cright%29+%3D+%5Ctext%7Btr%7D%5Cleft%28%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial%5Cboldsymbol%7Bh%7D_1%7D%5ET%28%5Csigma%27%28%5Cboldsymbol%7Ba%7D_1%29%5Codot+d%5Cboldsymbol%7Ba%7D_1%29%5Cright%29+%3D+%5Ctext%7Btr%7D%5Cleft%28%5Cleft%28%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial%5Cboldsymbol%7Bh%7D_1%7D%5Codot+%5Csigma%27%28%5Cboldsymbol%7Ba%7D_1%29%5Cright%29%5ETd%5Cboldsymbol%7Ba%7D_1%5Cright%29& alt=&\text{tr}\left(\frac{\partial l}{\partial\boldsymbol{h}_1}^Td\boldsymbol{h}_1\right) = \text{tr}\left(\frac{\partial l}{\partial\boldsymbol{h}_1}^T(\sigma'(\boldsymbol{a}_1)\odot d\boldsymbol{a}_1)\right) = \text{tr}\left(\left(\frac{\partial l}{\partial\boldsymbol{h}_1}\odot \sigma'(\boldsymbol{a}_1)\right)^Td\boldsymbol{a}_1\right)& eeimg=&1&&,得到&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial+%5Cboldsymbol%7Ba%7D_1%7D%3D+%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial%5Cboldsymbol%7Bh%7D_1%7D%5Codot%5Csigma%27%28%5Cboldsymbol%7Ba%7D_1%29& alt=&\frac{\partial l}{\partial \boldsymbol{a}_1}= \frac{\partial l}{\partial\boldsymbol{h}_1}\odot\sigma'(\boldsymbol{a}_1)& eeimg=&1&&。为求&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial+W_1%7D& alt=&\frac{\partial l}{\partial W_1}& eeimg=&1&&,再用一次复合法则:&img src=&/equation?tex=%5Ctext%7Btr%7D%5Cleft%28%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial%5Cboldsymbol%7Ba%7D_1%7D%5ETd%5Cboldsymbol%7Ba%7D_1%5Cright%29+%3D+%5Ctext%7Btr%7D%5Cleft%28%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial%5Cboldsymbol%7Ba%7D_1%7D%5ETdW_1%5Cboldsymbol%7Bx%7D%5Cright%29+%3D+%5Ctext%7Btr%7D%5Cleft%28%5Cboldsymbol%7Bx%7D%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial%5Cboldsymbol%7Ba%7D_1%7D%5ETdW_1%5Cright%29& alt=&\text{tr}\left(\frac{\partial l}{\partial\boldsymbol{a}_1}^Td\boldsymbol{a}_1\right) = \text{tr}\left(\frac{\partial l}{\partial\boldsymbol{a}_1}^TdW_1\boldsymbol{x}\right) = \text{tr}\left(\boldsymbol{x}\frac{\partial l}{\partial\boldsymbol{a}_1}^TdW_1\right)& eeimg=&1&&,得到&img src=&/equation?tex=%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial+W_1%7D%3D+%5Cfrac%7B%5Cpartial+l%7D%7B%5Cpartial%5Cboldsymbol%7Ba%7D_1%7D%5Cboldsymbol%7Bx%7D%5ET& alt=&\frac{\partial l}{\partial W_1}= \frac{\partial l}{\partial\boldsymbol{a}_1}\boldsymbol{x}^T& eeimg=&1&&。&/p&&p&下篇见&a href=&/p/& class=&internal&&&span class=&invisible&&https://&/span&&span class=&visible&&/p/24&/span&&span class=&invisible&&863977&/span&&span class=&ellipsis&&&/span&&/a&。&/p&
矩阵求导的技术,在统计学、控制论、机器学习等领域有广泛的应用。鉴于我看过的一些资料或言之不详、或繁乱无绪,本文来做个科普,分作两篇,上篇讲标量对矩阵的求导术,下篇讲矩阵对矩阵的求导术。本文使用小写字母x表示标量,粗体小写字母\boldsymbol{x} …
&p&昨天被日报转载了,褒贬不一,仍过千赞;最好的礼物。但是,除了日报,其它的转载请提前私信我,并注明出处。感谢各位捧场!&/p&&p&------------------------------------------------------------新年快乐
鸡年大吉--------------------------------------------------------&/p&&p&因为近期要做一个关于深度学习入门的技术分享,不想堆砌公式,让大家听得一头雾水不知不觉摸裤兜掏手机刷知乎。所以花了大量时间查资料看论文,有的博客或者论文写得非常赞,比如三巨头LeCun,Bengio和Hinton 2015年在Nature上发表综述论文的“&a href=&///?target=http%3A///nature/journal/v521/n7553/pdf/nature14539.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Deep Learning&i class=&icon-external&&&/i&&/a&”,言简意赅地引用了上百篇论文,但适合阅读,不适合presentation式的分享;再如Michael Nielsen写的电子书《神经网络与深度学习》(&a href=&///?target=http%3A///home/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&中文版&i class=&icon-external&&&/i&&/a&,&a href=&///?target=http%3A///index.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&英文版&i class=&icon-external&&&/i&&/a&)通俗易懂,用大量的例子解释了深度学习中的相关概念和基本原理,但适合于抽两三天的功夫来细品慢嚼,方能体会到作者的良苦用心;还有Colah写的&a href=&///?target=http%3A//colah.github.io/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&博客&i class=&icon-external&&&/i&&/a&,每一篇详细阐明了一个主题,如果已经入门,这些博客将带你进阶,非常有趣。&/p&&br&&p&还翻了很多知乎问答,非常赞。但发现很多”千赞侯”走的是汇总论文视频教程以及罗列代码路线,本来想两小时入门却一脚踏进了汪洋大海;私以为,这种适合于有一定实践积累后按需查阅。还有很多”百赞户”会拿鸡蛋啊猫啊狗啊的例子来解释深度学习的相关概念,生动形象,但我又觉得有避重就轻之嫌。我想,既然要入门深度学习,得有微积分的基础,会求导数偏导数,知道链式法则,最好还学过线性代数;否则,真的,不建议入门深度学习。&/p&&br&&p&最后,实在没找到我想要的表达方式。我想以图的方式概要而又系统性的呈现深度学习所涉及到的基本模型和相关概念。论文“&a href=&///?target=https%3A//arxiv.org/abs/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&A Critical Review of Recurrent Neural Networks for Sequence Learning&i class=&icon-external&&&/i&&/a&”中的示意图画得简单而又形象,足以说明问题,但这篇文章仅就RNN而展开论述,并未涉及CNN,RBM等其它经典模型;&a href=&///?target=https%3A//deeplearning4j.org/cn/neuralnet-overview.html%23forward& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Deeplearning4j&i class=&icon-external&&&/i&&/a&上的教程貌似缺少关于编码器相关内容的介绍,而&a href=&///?target=http%3A//ufldl.stanford.edu/wiki/index.php/UFLDL%25E6%E7%25A8%258B& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&UFLDL教程&i class=&icon-external&&&/i&&/a&只是详细介绍了编码器的方方面面。但是如果照抄以上三篇的图例,又涉及到图例中的模块和符号不统一的问题。所以,索性自己画了部分模型图;至于直接引用的图,文中已经给了链接或出处。如有不妥之处,望指正。以下,以飨来访。&/p&&br&&p&&b&1. &/b& 从经典的二分类开始说起,为此构建二分类的神经网络单元,并以Sigmoid函数和平方差损失(比较常用的还有交叉熵损失函数)函数来举例说明&a href=&///?target=https%3A//mp./s%3F__biz%3DMzA5ODUxOTA5Mg%3D%3D%26mid%3D%26idx%3D1%26sn%3D820ddc89e1d1af35f14ccf645b963a76%26chksm%3D8b7e45cdbc09ccdb985b3bbc22fbc0dcd013d53e9e9ab676b338af7bd8b7dd2a92d%26mpshare%3D1%26scene%3D1%26srcid%3D0930LxixeTcq5wCcRStBTylE%26pass_ticket%3Dw2yCF%252F3Z2KTqyWW%252FUwkvnidRV3HF9ym5iEfJ%252BZ1dMObpcYUW3hQymA4BpY9W3gn4%23rd& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&梯度下降法&i class=&icon-external&&&/i&&/a&以及基于链式法则的反向传播(BP),所有涉及到的公式都在这里:&/p&&img src=&/v2-eabfde057dcb30cb4f13d21_b.png& data-rawwidth=&921& data-rawheight=&446& class=&origin_image zh-lightbox-thumb& width=&921& data-original=&/v2-eabfde057dcb30cb4f13d21_r.png&&&br&&p&&b&2. &/b&神经元中的非线性变换激活函数(&a href=&///?target=https%3A//mp./s%3F__biz%3DMzI1NTE4NTUwOQ%3D%3D%26mid%3D%26idx%3D1%26sn%3D7bd8510d59ddc14e5d4036f2acaeaf8d%26mpshare%3D1%26scene%3D1%26srcid%3D1214qIBJrRhevScKXQQuqas4%26pass_ticket%3Dw2yCF%252F3Z2KTqyWW%252FUwkvnidRV3HF9ym5iEfJ%252BZ1dMObpcYUW3hQymA4BpY9W3gn4%23rd& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深度学习中的激活函数导引&i class=&icon-external&&&/i&&/a&)及其作用(参考&a href=&/people/yan-qin-rui& class=&internal&&颜沁睿&/a&的&a href=&/question//answer/& class=&internal&&回答&/a&),激活函数是神经网络强大的基础,好的激活函数(根据任务来选择)还可以加速训练:&/p&&img src=&/v2-a772cdd7e0_b.png& data-rawwidth=&1879& data-rawheight=&869& class=&origin_image zh-lightbox-thumb& width=&1879& data-original=&/v2-a772cdd7e0_r.png&&&p&不同的激活函数搭配不同的参数初始化策略,比如Tahn和&a href=&///?target=http%3A//jmlr.csail.mit.edu/proceedings/papers/v9/glorot10a/glorot10a.pdf%3Forigin%3Dpublication_detail& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Xavier初始化&i class=&icon-external&&&/i&&/a&方法:&/p&&img src=&/v2-cb13d57c7ac1f05f46cdfd3_b.png& data-rawwidth=&327& data-rawheight=&64& class=&content_image& width=&327&&&p&以及ReLU和MSRAFiller初始化(&a href=&///?target=http%3A///s%3Fwd%3Dpaperuri%253A%edfb3250f7fbbdeaab4e0d82ee9%2529%26filter%3Dsc_long_sign%26tn%3DSE_xueshusource_2kduw22v%26sc_vurl%3Dhttp%253A%252F%252Farxiv.org%252Fabs%252F%26ie%3Dutf-8%26sc_us%3D4386500& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&S&i class=&icon-external&&&/i&&/a&r&a href=&///?target=http%3A///s%3Fwd%3Dpaperuri%253A%edfb3250f7fbbdeaab4e0d82ee9%2529%26filter%3Dsc_long_sign%26tn%3DSE_xueshusource_2kduw22v%26sc_vurl%3Dhttp%253A%252F%252Farxiv.org%252Fabs%252F%26ie%3Dutf-8%26sc_us%3D4386500& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&urpassing&i class=&icon-external&&&/i&&/a&&a href=&///?target=http%3A///s%3Fwd%3Dpaperuri%253A%edfb3250f7fbbdeaab4e0d82ee9%2529%26filter%3Dsc_long_sign%26tn%3DSE_xueshusource_2kduw22v%26sc_vurl%3Dhttp%253A%252F%252Farxiv.org%252Fabs%252F%26ie%3Dutf-8%26sc_us%3D4386500& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&& Human&i class=&icon-external&&&/i&&/a&)方法。&/p&&p&&b&3.&/b& 前馈性神经网络和自动编码器的区别在于输出层,从而引出无监督学习的概念;而降噪编码器和自动编码器的区别又在输入层,即对输入进行部分遮挡或加入噪声;稀疏编码器(引出&a href=&///?target=https%3A//mp./s%3F__biz%3DMzA5ODUxOTA5Mg%3D%3D%26mid%3D%26idx%3D1%26sn%3D5b342e00a984fmpshare%3D1%26scene%3D1%26srcid%3D0802dqmt7jHAo8DZuBVYHO7T%26pass_ticket%3Dw2yCF%252F3Z2KTqyWW%252FUwkvnidRV3HF9ym5iEfJ%252BZ1dMObpcYUW3hQymA4BpY9W3gn4%23rd& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&正则项&i class=&icon-external&&&/i&&/a&的概念)和自动编码器的区别在隐藏层,即隐藏层的节点数大于输入层节点数;而编码器都属于无监督学习的范畴。浅层网络的不断栈式叠加构成相应的深度网络。&/p&&img src=&/v2-db450d64de91f_b.png& data-rawwidth=&929& data-rawheight=&446& class=&origin_image zh-lightbox-thumb& width=&929& data-original=&/v2-db450d64de91f_r.png&&&p&值得一提的是,三层前馈型神经网络(只包含一个隐藏层)的word2vec(&a href=&///?target=http%3A///t/word2vec-zhong-de-shu-xue-yuan-li-xiang-jie-duo-tu-wifixia-yue-du/178/1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&数学原理详解&i class=&icon-external&&&/i&&/a&)是迈向NLP的大门,包括CBOW和skip-gram两种模型,另外在输出层还分别做了基于Huffman树的Hierarchical Softmax以及negative sampling(就是选择性地更新连接负样本的权重参数)的加速。&/p&&br&&p&&b&4. &/b&受限波兹曼机RBM属于无监督学习中的生成学习,输入层和隐藏层的传播是双向的,分正向过程和反向过程,学习的是数据分布,因此又引出马尔可夫过程和Gibbs采样的概念,以及KL散度的度量概念:&/p&&img src=&/v2-cd53ee50bf533bf13dc73_b.png& data-rawwidth=&940& data-rawheight=&434& class=&origin_image zh-lightbox-thumb& width=&940& data-original=&/v2-cd53ee50bf533bf13dc73_r.png&&&p&与生成学习对应的是判别学习也就是大多数的分类器,生成对抗网络GAN融合两者;对抗是指生成模型与判别模型的零和博弈,近两年最激动人心的应用是从文本生成图像(&a href=&///?target=http%3A//www.evolvingai.org/ppgn& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Evolving AI Lab - University of Wyoming&i class=&icon-external&&&/i&&/a&)(参考代码:&a href=&///?target=https%3A///paarthneekhara/text-to-image& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&text-to-image&i class=&icon-external&&&/i&&/a&):&/p&&img src=&/v2-53b180b2f2b7e9f37f712c8ae12e8f43_b.png& data-rawwidth=&1279& data-rawheight=&599& class=&origin_image zh-lightbox-thumb& width=&1279& data-original=&/v2-53b180b2f2b7e9f37f712c8ae12e8f43_r.png&&&p&再推荐一个讲DCGAN的超赞教程&a href=&///?target=http%3A//bamos.github.io//deep-completion/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Image Completion with Deep Learning in TensorFlow&i class=&icon-external&&&/i&&/a& (参考代码:&a href=&///?target=https%3A///bamos/dcgan-completion.tensorflow& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&dcgan-completion.tensorflow&i class=&icon-external&&&/i&&/a&):&/p&&img src=&/v2-c26e080dd30e8a07dae07_b.png& data-rawwidth=&815& data-rawheight=&336& class=&origin_image zh-lightbox-thumb& width=&815& data-original=&/v2-c26e080dd30e8a07dae07_r.png&&&p&&b&5. &/b&深度网络的实现基于逐层贪心训练算法,而随着模型的深度逐渐增加,会产生梯度消失或梯度爆炸的问题,梯度爆炸一般采用阈值截断的方法解决,而梯度消失不易解决;网络越深,这些问题越严重,这也是深度学习的核心问题,出现一系列技术及衍生模型。&/p&&img src=&/v2-247ecfca25fcad04aa765_b.png& data-rawwidth=&869& data-rawheight=&441& class=&origin_image zh-lightbox-thumb& width=&869& data-original=&/v2-247ecfca25fcad04aa765_r.png&&&p&深度制胜,网络越深越好,因此有了&a href=&///?target=http%3A///s%3Fwd%3Dpaperuri%253A%feb4e6fa11f79%2529%26filter%3Dsc_long_sign%26tn%3DSE_xu

我要回帖

更多关于 soup是什么意思 的文章

 

随机推荐