-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlocal-search.xml
1353 lines (649 loc) · 722 KB
/
local-search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>终端 常用快捷键总结</title>
<link href="/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/Linux%20%E5%B8%B8%E7%94%A8%E5%BF%AB%E6%8D%B7%E9%94%AE%E6%80%BB%E7%BB%93/"/>
<url>/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/Linux%20%E5%B8%B8%E7%94%A8%E5%BF%AB%E6%8D%B7%E9%94%AE%E6%80%BB%E7%BB%93/</url>
<content type="html"><![CDATA[<h1 id="终端-常用快捷键总结"><a class="markdownIt-Anchor" href="#终端-常用快捷键总结"></a> 终端 常用快捷键总结</h1><h2 id="压缩相关"><a class="markdownIt-Anchor" href="#压缩相关"></a> 压缩相关</h2><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs sh">工作积累:<br>unzip FileName.zip <span class="hljs-comment"># 解压</span><br>zip FileName.zip DirName <span class="hljs-comment"># 将DirName本身压缩</span><br>zip -r FileName.zip DirName <span class="hljs-comment"># 压缩,递归处理,将指定目录下的所有文件和子目录一并压缩</span><br><span class="hljs-comment"># 感觉.zip占用空间比.tar.gz大(但是.tar.gz不好记)</span><br></code></pre></td></tr></table></figure><h2 id="创建软连接"><a class="markdownIt-Anchor" href="#创建软连接"></a> 创建软连接</h2><figure class="highlight 1c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs 1c">Linux <span class="hljs-meta">& Ubuntu:</span><br>将命令行添加到 <span class="hljs-symbol">~/.bashrc 里面</span><br><span class="hljs-symbol">eg</span>:alias py39='source activate py39'<br>然后:<br>source <span class="hljs-symbol">~/.bashrc</span><br></code></pre></td></tr></table></figure><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs sh">Mac:<br>将命令行添加到 ~/.zshrc 里面<br>eg:<span class="hljs-built_in">alias</span> myblog=<span class="hljs-string">'cd /Users/zhangxuewen/Library/Mobile\ Documents/com~apple~CloudDocs/myBlog'</span><br>然后:<br><span class="hljs-built_in">source</span> ~/.zshrc<br></code></pre></td></tr></table></figure>]]></content>
<categories>
<category>计算机相关</category>
</categories>
<tags>
<tag>Linux</tag>
</tags>
</entry>
<entry>
<title>Miniconda 使用总结</title>
<link href="/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/miniconda%E4%BD%BF%E7%94%A8%E6%80%BB%E7%BB%93/"/>
<url>/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/miniconda%E4%BD%BF%E7%94%A8%E6%80%BB%E7%BB%93/</url>
<content type="html"><![CDATA[<h1 id="miniconda-使用总结"><a class="markdownIt-Anchor" href="#miniconda-使用总结"></a> Miniconda 使用总结</h1><h3 id="1-下载-anaconda"><a class="markdownIt-Anchor" href="#1-下载-anaconda"></a> 1. 下载 Anaconda</h3><p>进入 Ubuntu,自己新建下载路径,输入以下命令开始下载</p><blockquote><p>注意,如果不是 x86_64,需要去镜像看对应的版本(<a href="https://link.zhihu.com/?target=https%3A//mirrors.bfsu.edu.cn/anaconda/archive/%3FC%3DM%26O%3DA">https://mirrors.bfsu.edu.cn/anaconda/archive/?C=M&O=A</a>)</p></blockquote><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs vim">wget http<span class="hljs-variable">s:</span>//repo.anaconda.<span class="hljs-keyword">com</span>/miniconda/Miniconda3-latest-Linux-x86_64.<span class="hljs-keyword">sh</span><br></code></pre></td></tr></table></figure><h3 id="2-安装-anaconda"><a class="markdownIt-Anchor" href="#2-安装-anaconda"></a> 2. 安装 Anaconda</h3><p>输入命令</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs css"><span class="hljs-selector-tag">bash</span> <span class="hljs-selector-tag">Anaconda3-2021</span><span class="hljs-selector-class">.11-Linux-x86_64</span><span class="hljs-selector-class">.sh</span><br></code></pre></td></tr></table></figure><blockquote><p>回车后查看许可证,按 q 退出许可证,然后输入 yes 表示同意</p><p>确认安装的路径,一般直接回车安装在默认的 /home/你的名字/miniconda</p><p>很快就安装完毕。输入 yes 来确认使用 conda init 来启动</p></blockquote><h3 id="3-启动环境变量"><a class="markdownIt-Anchor" href="#3-启动环境变量"></a> 3. 启动环境变量</h3><p>如果现在输入 conda,会显示找不到命令</p><p>需要启动已经修改环境变量,输入以下命令(以后都不用再 source 了,因为启动 Ubuntu 会自动 source)</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">source</span> ~/.bashrc<br></code></pre></td></tr></table></figure><p>这时候会发现出现了 (base)</p><h3 id="4-升级-conda"><a class="markdownIt-Anchor" href="#4-升级-conda"></a> 4. 升级 conda</h3><p>如果当前安装后,不是最新版本,可以通过以下命令升级</p><figure class="highlight excel"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs excel">conda update -<span class="hljs-built_in">n</span> <span class="hljs-built_in">base</span> -c defaults conda<br></code></pre></td></tr></table></figure><h3 id="5-创建虚拟环境"><a class="markdownIt-Anchor" href="#5-创建虚拟环境"></a> 5. 创建虚拟环境</h3><h4 id="51-常规创建方法"><a class="markdownIt-Anchor" href="#51-常规创建方法"></a> 5.1 常规创建方法</h4><p>输入以下命令创建名为 py39 的虚拟环境,python 版本为 3.9</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs routeros">conda create -n py39 <span class="hljs-attribute">python</span>=3.9<br></code></pre></td></tr></table></figure><p>也可以将以下命令行添加到 ~/.bashrc 里面,这样以后只需要输入 py39 就直接进入了</p><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs applescript"><span class="hljs-built_in">alias</span> py39='source <span class="hljs-built_in">activate</span> py39'<br></code></pre></td></tr></table></figure><h4 id="52-需要使用-jupyterlab-的创建方法"><a class="markdownIt-Anchor" href="#52-需要使用-jupyterlab-的创建方法"></a> 5.2 需要使用 jupyterlab 的创建方法</h4><p>方法一:创建环境时直接添加 ipykernel</p><p>创建虚拟环境, 执行命令创建虚拟环境(以nlpbase为例):</p><figure class="highlight angelscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs angelscript">conda create -n nlpbase ipykernel -y<br><span class="hljs-keyword">or</span><br>conda create -n glm3<span class="hljs-number">-6</span>b-env python=<span class="hljs-number">3.8</span> ipykernel -y<br></code></pre></td></tr></table></figure><p>方法二:给已创建好的虚拟环境添加 ipykernel n(以已经创建好了tensorflow2虚拟环境为例)</p><figure class="highlight excel"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs excel">适合已通过 conda create -<span class="hljs-built_in">n</span> virtual_enviroment 创建好虚拟环境,但没有添加 ipykernel 的情况<br><br>方法:conda install -<span class="hljs-built_in">n</span> 虚拟环境名称 ipykernel<br>实例:<br>conda install -<span class="hljs-built_in">n</span> tensorflow2 ipykernel<br></code></pre></td></tr></table></figure><p>激活进入虚拟环境,执行命令进入创建好的虚拟环境:</p><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs applescript">conda <span class="hljs-built_in">activate</span> nlpbase<br></code></pre></td></tr></table></figure><p>将虚拟环境写入Jupyter的kernel中,命令格式为:</p><figure class="highlight brainfuck"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs brainfuck"><span class="hljs-comment">python</span> <span class="hljs-literal">-</span><span class="hljs-comment">m</span> <span class="hljs-comment">ipykernel</span> <span class="hljs-comment">install</span> --<span class="hljs-comment">name</span> <span class="hljs-comment">虚拟环境名</span> --<span class="hljs-comment">display</span><span class="hljs-literal">-</span><span class="hljs-comment">name</span> <span class="hljs-comment">虚拟环境名</span><br><span class="hljs-comment"></span><br><span class="hljs-comment">eg:python</span> <span class="hljs-literal">-</span><span class="hljs-comment">m</span> <span class="hljs-comment">ipykernel</span> <span class="hljs-comment">install</span> --<span class="hljs-comment">name</span> <span class="hljs-comment">nlpbase</span> --<span class="hljs-comment">display</span><span class="hljs-literal">-</span><span class="hljs-comment">name</span> <span class="hljs-comment">nlpbase</span><br></code></pre></td></tr></table></figure><p>在Jupyter Lab中刷新确认,配置好后,刷新Jupyter Lab的页面,再查看内核列表:</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/image-20240322172848750.png" srcset="/img/loading.gif" lazyload alt="image-20240322172848750"></p><h3 id="6-进入虚拟环境"><a class="markdownIt-Anchor" href="#6-进入虚拟环境"></a> 6. 进入虚拟环境</h3><p>输入以下命令进入我们创建的虚拟环境 py39</p><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs applescript">source <span class="hljs-built_in">activate</span> py39<br></code></pre></td></tr></table></figure><p>也可以将以下命令行添加到 ~/.bashrc 里面,这样以后只需要输入 py39 就直接进入了</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">alias</span> py39=<span class="hljs-string">'source activate py39'</span><br><br>然后:<br><span class="hljs-built_in">source</span> ~/.bashrc<br></code></pre></td></tr></table></figure><h3 id="7-conda-其他常用命令"><a class="markdownIt-Anchor" href="#7-conda-其他常用命令"></a> 7. Conda 其他常用命令</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-comment">#创建虚拟环境</span><br>conda <span class="hljs-keyword">create</span> -n your_env_name python=X.X(<span class="hljs-number">3.6</span>、<span class="hljs-number">3.7</span>等)<br> <br><span class="hljs-comment">#激活虚拟环境</span><br><span class="hljs-keyword">source</span> <span class="hljs-keyword">activate</span> your_env_name(虚拟环境名称)<br> <br><span class="hljs-comment">#退出虚拟环境</span><br><span class="hljs-keyword">source</span> deactivate your_env_name(虚拟环境名称)<br> <br><span class="hljs-comment">#删除虚拟环境</span><br>conda remove -n your_env_name(虚拟环境名称) <span class="hljs-comment">--all</span><br> <br><span class="hljs-comment">#查看安装了哪些包</span><br>conda <span class="hljs-keyword">list</span><br> <br><span class="hljs-comment">#安装包</span><br>conda <span class="hljs-keyword">install</span> package_name(包名)<br>conda <span class="hljs-keyword">install</span> scrapy==<span class="hljs-number">1.3</span> <span class="hljs-comment"># 安装指定版本的包</span><br>conda <span class="hljs-keyword">install</span> -n 环境名 包名 <span class="hljs-comment"># 在conda指定的某个环境中安装包</span><br> <br><span class="hljs-comment">#查看当前存在哪些虚拟环境</span><br>conda env <span class="hljs-keyword">list</span> <br><span class="hljs-comment">#或 </span><br>conda info -e<br><span class="hljs-comment">#或</span><br>conda info <span class="hljs-comment">--envs</span><br> <br><span class="hljs-comment">#检查更新当前conda</span><br>conda <span class="hljs-keyword">update</span> conda<br> <br><span class="hljs-comment">#更新anaconda</span><br>conda <span class="hljs-keyword">update</span> anaconda<br> <br><span class="hljs-comment">#更新所有库</span><br>conda <span class="hljs-keyword">update</span> <span class="hljs-comment">--all</span><br> <br><span class="hljs-comment">#更新python</span><br>conda <span class="hljs-keyword">update</span> python<br></code></pre></td></tr></table></figure><p>参考资料:</p><p><a href="https://zhuanlan.zhihu.com/p/459607806" target="_blank" rel="noopener">https://zhuanlan.zhihu.com/p/459607806</a></p>]]></content>
<categories>
<category>计算机相关</category>
</categories>
<tags>
<tag>Linux</tag>
</tags>
</entry>
<entry>
<title>iTerm2 快捷键大全</title>
<link href="/terminal/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/iTerm2%20%E5%BF%AB%E6%8D%B7%E9%94%AE%E5%A4%A7%E5%85%A8/"/>
<url>/terminal/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/iTerm2%20%E5%BF%AB%E6%8D%B7%E9%94%AE%E5%A4%A7%E5%85%A8/</url>
<content type="html"><![CDATA[<h1 id="iterm2-快捷键大全"><a class="markdownIt-Anchor" href="#iterm2-快捷键大全"></a> iTerm2 快捷键大全</h1><h3 id="标签"><a class="markdownIt-Anchor" href="#标签"></a> 标签</h3><figure class="highlight livecodeserver"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs livecodeserver">新建标签:<span class="hljs-keyword">command</span> + <span class="hljs-title">t</span><br><br>关闭标签:<span class="hljs-keyword">command</span> + <span class="hljs-title">w</span><br><br>切换标签:<span class="hljs-keyword">command</span> + 数字 <span class="hljs-title">command</span> + 左右方向键<br><br>切换全屏:<span class="hljs-keyword">command</span> + <span class="hljs-title">enter</span><br></code></pre></td></tr></table></figure><h3 id="分屏"><a class="markdownIt-Anchor" href="#分屏"></a> 分屏</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs bash">垂直分屏:<span class="hljs-built_in">command</span> + d<br><br>水平分屏:<span class="hljs-built_in">command</span> + <span class="hljs-built_in">shift</span> + d<br><br>切换屏幕:<span class="hljs-built_in">command</span> + option + 方向键 <span class="hljs-built_in">command</span> + [ 或 <span class="hljs-built_in">command</span> + ]<br></code></pre></td></tr></table></figure><h3 id="移动"><a class="markdownIt-Anchor" href="#移动"></a> 移动</h3><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs stylus">到行首:ctrl + a<br><br>到行尾:ctrl + e<br><br>前进后退:ctrl + f/<span class="hljs-selector-tag">b</span> (相当于左右方向键)<br><br>交换光标处文本:ctrl + t<br><br>光标按照单词移动: option + 左右方向键<br></code></pre></td></tr></table></figure><blockquote><p>光标按照单词移动设置参考:<a href="https://cloud.tencent.com/developer/article/2007706" target="_blank" rel="noopener">https://cloud.tencent.com/developer/article/2007706</a></p></blockquote><h3 id="删除"><a class="markdownIt-Anchor" href="#删除"></a> 删除</h3><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs less">清除当前行:<span class="hljs-selector-tag">ctrl</span> + <span class="hljs-selector-tag">u</span> (无论光标在什么位置)<br><br>删除当前光标的字符:<span class="hljs-selector-tag">ctrl</span> + <span class="hljs-selector-tag">d</span><br><br>删除光标之前的字符:<span class="hljs-selector-tag">ctrl</span> + <span class="hljs-selector-tag">h</span><br><br>删除光标之前的单词:<span class="hljs-selector-tag">ctrl</span> + <span class="hljs-selector-tag">w</span><br><br>删除到文本末尾:<span class="hljs-selector-tag">ctrl</span> + <span class="hljs-selector-tag">k</span><br><br>清屏:<span class="hljs-selector-tag">command</span> + <span class="hljs-selector-tag">r</span> (ctrl + l) (一种伪删除)<br></code></pre></td></tr></table></figure><h3 id="查找"><a class="markdownIt-Anchor" href="#查找"></a> 查找</h3><figure class="highlight livecodeserver"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs livecodeserver">查找:<span class="hljs-keyword">command</span> + <span class="hljs-title">f</span><br><br>查看历史命令:<span class="hljs-keyword">command</span> + ; (输入开头命令后 按 ⌘ + ; 会自动列出输入过的命令)<br><br>查看剪贴板历史:<span class="hljs-keyword">command</span> + <span class="hljs-title">shift</span> + <span class="hljs-title">h</span><br><br>查看上一条命令:ctrl + p<br><br>搜索命令历史:ctrl + r (这个用起来不错)<br></code></pre></td></tr></table></figure><h3 id="选中即复制"><a class="markdownIt-Anchor" href="#选中即复制"></a> 选中即复制</h3><blockquote><p>选择即复制 + 鼠标中键粘贴,这个很实用</p></blockquote><p>iterm2 有 2 种好用的选中即复制模式。</p><ul><li><strong>一种是用鼠标,在 iterm2 中,选中某个路径或者某个词汇,那么,iterm2 就自动复制了。</strong></li><li>另一种是无鼠标模式,<code>command+f</code>,弹出 iterm2 的查找模式,输入要查找并复制的内容的前几个字母,确认找到的是自己的内容之后,输入 <code>tab</code>,查找窗口将自动变化内容,并将其复制。如果输入的是 <code>shift+tab</code>,则自动将查找内容的左边选中并复制。</li></ul><hr><hr><h3 id="参考"><a class="markdownIt-Anchor" href="#参考"></a> 参考</h3><ul><li><a href="https://developer.aliyun.com/article/659166" target="_blank" rel="noopener">https://developer.aliyun.com/article/659166</a></li><li><a href="https://cnbin.github.io/blog/2015/06/20/iterm2-kuai-jie-jian-da-quan/?spm=a2c6h.12873639.article-detail.7.ea20a040L2tMbf" target="_blank" rel="noopener">https://cnbin.github.io/blog/2015/06/20/iterm2-kuai-jie-jian-da-quan/?spm=a2c6h.12873639.article-detail.7.ea20a040L2tMbf</a></li></ul>]]></content>
<categories>
<category>terminal</category>
</categories>
</entry>
<entry>
<title>nvidia-smi命令总结</title>
<link href="/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/nvidia-smi%E5%91%BD%E4%BB%A4%E6%80%BB%E7%BB%93/"/>
<url>/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/nvidia-smi%E5%91%BD%E4%BB%A4%E6%80%BB%E7%BB%93/</url>
<content type="html"><![CDATA[<h1 id="nvidia-smi命令总结"><a class="markdownIt-Anchor" href="#nvidia-smi命令总结"></a> nvidia-smi命令总结</h1><ul><li><p>nvidia-smi(NVIDIA System Management Interface)是一种命令行实用程序,用于监控和管理 NVIDIA GPU(图形处理器)的状态和性能。它提供了一种简单而强大的方式来获取有关 GPU 的实时信息,并且可以用于诊断、优化和管理 GPU 资源。</p></li><li><p>详细的信息可以去手册中查找:man nvidia-smi</p></li><li><p>在大多数情况下,nvidia-smi 是与 NVIDIA GPU 驱动程序一起安装的,当安装 NVIDIA GPU 驱动程序时,nvidia-smi 工具通常会自动包含在驱动程序软件包中,并在安装过程中将其放置在适当的位置。</p></li></ul><h2 id="1-nvidia-smi-面板解析"><a class="markdownIt-Anchor" href="#1-nvidia-smi-面板解析"></a> 1. <code>nvidia-smi</code> 面板解析</h2><h3 id="11-面板参数解释"><a class="markdownIt-Anchor" href="#11-面板参数解释"></a> 1.1 面板参数解释</h3><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/image-20240131112538773.png" srcset="/img/loading.gif" lazyload alt="image-20240131112538773"></p><ul><li>GPU:本机中的GPU编号,从0开始,上图为0,1,2,3四块GPU</li><li>Fan:风扇转速(0%-100%),N/A表示没有风扇</li><li>Name:GPU名字/类型,上图四块均为NVIDIA GeForce RTX 3080</li><li>Temp:GPU温度(GPU温度过高会导致GPU频率下降)</li><li>Perf:性能状态,从P0(最大性能)到P12(最小性能),上图均为P2</li><li>Pwr:Usager/Cap:GPU功耗,Usage表示用了多少,Cap表示总共多少</li><li>Persistence-M:持续模式状态,持续模式耗能大,但在新的GPU应用启动时花费时间更少,上图均为On</li></ul><hr><ul><li>Bus-Id:GPU总线</li><li>Disp.A:Display Active,表示GPU是否初始化</li><li>Memory-Usage:显存使用率</li></ul><hr><ul><li>Volatile GPU-UTil:GPU使用率,与显存使用率的区别可参考显存与GPU</li><li>Uncorr. ECC:是否开启错误检查和纠错技术,0/DISABLED,1/ENABLED,上图均为N/A</li><li>Compute M:计算模式,0/DEFAULT,1/EXCLUSIVE_PROCESS,2/PROHIBITED,上图均为Default</li></ul><hr><ul><li>Processes:显示每个进程占用的显存使用率、进程号、占用的哪个GPU</li></ul><h3 id="12-参数举例"><a class="markdownIt-Anchor" href="#12-参数举例"></a> 1.2 参数举例</h3><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/image-20240131112955725.png" srcset="/img/loading.gif" lazyload alt="image-20240131112955725"></p><blockquote><p>Reference:Adenialzz</p></blockquote><h2 id="2-nividia-smi-常用选项"><a class="markdownIt-Anchor" href="#2-nividia-smi-常用选项"></a> 2. Nividia-smi 常用选项</h2><p>注意⚠️:命令的可用选项和输出可能会因 NVIDIA 驱动程序版本和 GPU 型号而有所不同,可以通过 nvidia-smi --help 命令查看完整的选项列表和用法说明。</p><ul><li>-h 查看帮助手册:nvidia-smi -h</li><li><strong>动态地观察 GPU 的状态:watch -n 1 nvidia-smi</strong></li><li>-i 查看指定GPU:nvidia-smi -i 0</li><li>-L 查看GPU列表及其UUID:nvidia-smi -L</li><li>-l 指定动态刷新时间,默认5秒刷新一次,通过Ctrl+C停止:nvidia-smi -l 5</li><li>-q 查询GPU详细信息:nvidia-smi -q</li><li>只列出某一GPU的详细信息,可使用 -i 选项指定:nvidia-smi -q -i 0</li><li>在所有 GPU 上启用持久性模式:nvidia-smi -pm 1</li><li>指定开启某个显卡的持久模式:nvidia-smi -pm 1 -i 0</li><li>以 1 秒的更新间隔监控整体 GPU 使用情况:nvidia-smi dmon</li><li>以 1 秒的更新间隔监控每个进程的 GPU 使用情况:nvidia-smi pmon</li></ul><h2 id="3-显存与gpu的区别"><a class="markdownIt-Anchor" href="#3-显存与gpu的区别"></a> 3. 显存与GPU的区别</h2><p>显存(Video RAM,VRAM)和 GPU(Graphics Processing Unit)是计算机图形处理中的两个不同概念。</p><p>显存(VRAM):显存是一种特殊类型的内存,用于存储图形数据和纹理等与图像显示相关的数据。它通常位于独立的显卡(或显卡集成在主板上的集成图形处理器)中,也被称为图形存储器。显存具有高带宽和低延迟的特点,可用于快速读取和写入图像数据,以供 GPU 进行图形渲染和处理。显存的容量通常以兆字节(MB)或千兆字节(GB)为单位。<br>GPU(图形处理单元):GPU 是一种专门设计用于处理图形和图像数据的处理器。它是计算机图形渲染和加速的关键组件。GPU 负责执行图形渲染管线中的各个阶段,包括几何计算、光栅化、像素处理等,以生成最终的图像。GPU 还能执行通用计算任务,因此在许多领域,如科学计算、机器学习和密码破解等,GPU 也被广泛应用。显存是 GPU 的一部分,用于存储 GPU 处理所需的图形数据。<br>总结起来,显存是一种专门用于存储图形数据的内存,而 GPU 是一种专门用于处理图形和图像数据的处理器。显存和 GPU 是紧密相关的,GPU 使用显存来存储和处理图形数据,以实现高性能的图形渲染和处理能力。</p><hr><h2 id="4python-脚本指定用哪块gpu"><a class="markdownIt-Anchor" href="#4python-脚本指定用哪块gpu"></a> 4.python 脚本指定用哪块GPU</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># 一般情况:</span><br><span class="hljs-keyword">import</span> os <br>os.environ[<span class="hljs-string">"CUDA_DEVICE_ORDER"</span>] = <span class="hljs-string">"PCI_BUS_ID"</span> <span class="hljs-comment">#(保证程序cuda序号与实际cuda序号对应)</span><br>os.environ[<span class="hljs-string">'CUDA_VISIBLE_DEVICES'</span>] = <span class="hljs-string">"0,1"</span> <span class="hljs-comment">#(代表仅使用第0,1号GPU)</span><br> <br><span class="hljs-comment"># 单GPU:</span><br>os.environ[<span class="hljs-string">"CUDA_VISIBLE_DEVICES"</span>] = <span class="hljs-string">"2"</span> <span class="hljs-comment">#代表只使用第3个gpu</span><br><br><span class="hljs-comment"># 添加系统变量, 这里是要使用的GPU编号</span><br>export CUDA_VISIBLE_DEVICES=<span class="hljs-number">0</span><br> <br><span class="hljs-comment"># 在程序开头设置</span><br>os.environ[<span class="hljs-string">"CUDA_VISIBLE_DEVICES"</span>] = <span class="hljs-string">'0,1,2,3'</span><br> <br><span class="hljs-comment"># 运行程序时使用命令行,来设置该程序可见的gpu:</span><br>CUDA_VISIBLE_DEVICES=<span class="hljs-number">0</span>,<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span> python xxx.py<br></code></pre></td></tr></table></figure><p>参考链接:</p><ul><li><a href="https://blog.csdn.net/daydayup858/article/details/131633445" target="_blank" rel="noopener">https://blog.csdn.net/daydayup858/article/details/131633445</a></li></ul>]]></content>
<categories>
<category>计算机相关</category>
</categories>
<tags>
<tag>Linux</tag>
</tags>
</entry>
<entry>
<title>超实用压力测试工具-ab工具</title>
<link href="/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E8%B6%85%E5%AE%9E%E7%94%A8%E5%8E%8B%E5%8A%9B%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7%EF%BC%8Dab%E5%B7%A5%E5%85%B7/"/>
<url>/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E8%B6%85%E5%AE%9E%E7%94%A8%E5%8E%8B%E5%8A%9B%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7%EF%BC%8Dab%E5%B7%A5%E5%85%B7/</url>
<content type="html"><![CDATA[<h1 id="超实用压力测试工具-ab工具"><a class="markdownIt-Anchor" href="#超实用压力测试工具-ab工具"></a> 超实用压力测试工具-ab工具</h1><h3 id="写在前面"><a class="markdownIt-Anchor" href="#写在前面"></a> 写在前面</h3><hr><p>在学习ab工具之前,我们需了解几个关于压力测试的概念</p><ol><li><strong>吞吐率(Requests per second)</strong><br>概念:服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。<br>计算公式:总请求数 / 处理完成这些请求数所花费的时间,即<br>Request per second = Complete requests / Time taken for tests</li><li><strong>并发连接数(The number of concurrent connections)</strong><br>概念:某个时刻服务器所接受的请求数目,简单的讲,就是一个会话。</li><li><strong>并发用户数(The number of concurrent users,Concurrency Level)</strong><br>概念:要注意区分这个概念和并发连接数之间的区别,一个用户可能同时会产生多个会话,也即连接数。</li><li><strong>用户平均请求等待时间(Time per request)</strong><br>计算公式:处理完成所有请求数所花费的时间/ (总请求数 / 并发用户数),即<br>Time per request = Time taken for tests /( Complete requests / Concurrency Level)</li><li><strong>服务器平均请求等待时间(Time per request: across all concurrent requests)</strong><br>计算公式:处理完成所有请求数所花费的时间 / 总请求数,即<br>Time taken for / testsComplete requests<br>可以看到,它是吞吐率的倒数。<br>同时,它也=用户平均请求等待时间/并发用户数,即<br>Time per request / Concurrency Level</li></ol><h3 id="ab工具简介"><a class="markdownIt-Anchor" href="#ab工具简介"></a> ab工具简介</h3><hr><p>ab全称为:apache bench</p><ul><li>在官网上的解释如下:</li></ul><blockquote><p>ab是Apache超文本传输协议(HTTP)的性能测试工具。其设计意图是描绘当前所安装的Apache的执行性能,主要是显示你安装的Apache每秒可以处理多少个请求。</p></blockquote><ul><li>其他网站解释:</li></ul><blockquote><p>ab是apache自带的压力测试工具。ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。比如nginx、tomcat、IIS等。</p></blockquote><h3 id="下载ab工具"><a class="markdownIt-Anchor" href="#下载ab工具"></a> 下载ab工具</h3><hr><p>进入apache官网 <a href="https://link.jianshu.com?t=http://httpd.apache.org/" target="_blank" rel="noopener">http://httpd.apache.org/</a> 下载apache即可</p><h3 id="启动ab工具"><a class="markdownIt-Anchor" href="#启动ab工具"></a> 启动ab工具</h3><hr><p>以windows环境下,apache安装路径为C:\apache\Apache24\为例</p><p>打开终端,输入命令<br><code>cd C:\apache\Apache24\bin</code><br>即可启动ab</p><h3 id="开始测试"><a class="markdownIt-Anchor" href="#开始测试"></a> 开始测试</h3><hr><p>输入命令<br><code>ab -n 100 -c 10 http://test.com/</code><br>其中-n表示请求数,-c表示并发数</p><p>其余命令请参见 <a href="https://link.jianshu.com?t=http://apache.jz123.cn/programs/ab.html" target="_blank" rel="noopener">http://apache.jz123.cn/programs/ab.html</a></p><h3 id="测试结果分析"><a class="markdownIt-Anchor" href="#测试结果分析"></a> 测试结果分析</h3><hr><p>上面的命令运行完毕后就出来测试报告了</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/539132-78416e4b8ec72659.png.webp" srcset="/img/loading.gif" lazyload alt="539132-78416e4b8ec72659.png"></p><p>完整测试报告</p><ul><li>这段展示的是web服务器的信息,可以看到服务器采用的是nginx,<a href="http://xn--wan-q33er8of2z.bigertech.com" target="_blank" rel="noopener">域名是wan.bigertech.com</a>,端口是80</li></ul><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/image-20231030202531733.png" srcset="/img/loading.gif" lazyload alt="image-20231030202531733" style="zoom:50%"><p>服务器信息</p><ul><li>这段是关于请求的文档的相关信息,所在位置“/”,文档的大小为338436 bytes(此为http响应的正文长度)</li></ul><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/image-20231030202553812.png" srcset="/img/loading.gif" lazyload alt="image-20231030202553812" style="zoom:50%"><p>文档信息</p><ul><li>这段展示了压力测试的几个<strong>重要指标</strong></li></ul><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/image-20231030202611705.png" srcset="/img/loading.gif" lazyload alt="image-20231030202611705" style="zoom:67%"><p>重要指标</p><figure class="highlight angelscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><code class="hljs angelscript">Concurrency Level: <span class="hljs-number">100</span><br> <span class="hljs-comment">//并发请求数</span><br> Time taken <span class="hljs-keyword">for</span> tests: <span class="hljs-number">50.872</span> seconds<br> <span class="hljs-comment">//整个测试持续的时间</span><br> Complete requests: <span class="hljs-number">1000</span><br> <span class="hljs-comment">//完成的请求数</span><br> Failed requests: <span class="hljs-number">0</span><br> <span class="hljs-comment">//失败的请求数</span><br><br>Total transferred: <span class="hljs-number">13701482</span> bytes<br> <span class="hljs-comment">//整个场景中的网络传输量</span><br> HTML transferred: <span class="hljs-number">13197000</span> bytes<br> <span class="hljs-comment">//整个场景中的HTML内容传输量</span><br><br>**Requests per second: <span class="hljs-number">19.66</span> [#/sec] (mean)<br> <span class="hljs-comment">//吞吐率,大家最关心的指标之一,相当于 LR 中的每秒事务数,后面括号中的 mean 表示这是一个平均值</span><br> Time per request: <span class="hljs-number">5087.180</span> [ms] (mean)<br> <span class="hljs-comment">//用户平均请求等待时间,大家最关心的指标之二,相当于 LR 中的平均事务响应时间,后面括号中的 mean 表示这是一个平均值</span><br> Time per request: <span class="hljs-number">50.872</span> [ms] (mean, across all concurrent requests)<br> <span class="hljs-comment">//服务器平均请求处理时间,大家最关心的指标之三**</span><br><br>Transfer rate: <span class="hljs-number">263.02</span> [Kbytes/sec] received<br> <span class="hljs-comment">//平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题</span><br></code></pre></td></tr></table></figure><ul><li>这段表示网络上消耗的时间的分解</li></ul><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/image-20231030202631732.png" srcset="/img/loading.gif" lazyload alt="image-20231030202631732" style="zoom:50%"><p>网络消耗时间</p><ul><li>这段是每个请求处理时间的分布情况,50%的处理时间在4930ms内,66%的处理时间在5008ms内…,重要的是看**90%**的处理时间。</li></ul><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/image-20231030202644846.png" srcset="/img/loading.gif" lazyload alt="image-20231030202644846" style="zoom:50%"><p>响应情况</p><h3 id="关于登录的问题"><a class="markdownIt-Anchor" href="#关于登录的问题"></a> 关于登录的问题</h3><hr><p>有时候进行压力测试需要用户登录,怎么办?<br>请参考以下步骤:</p><ol><li><p>先用账户和密码登录后,用开发者工具找到标识这个会话的Cookie值(Session ID)记下来</p></li><li><p>如果只用到一个Cookie,那么只需键入命令:<br><code>ab -n 100 -C key=value http://test.com/</code></p><p>如果需要多个Cookie,就直接设Header:<br><code>ab -n 100 -H “Cookie: Key1=Value1; Key2=Value2” http://test.com/</code></p></li></ol><h3 id="总结"><a class="markdownIt-Anchor" href="#总结"></a> 总结</h3><hr><p>总的来说ab工具ab小巧简单,上手学习较快,可以提供需要的基本性能指标,但是没有图形化结果,不能监控。因此ab工具可以用作临时紧急任务和简单测试。<br>同类型的压力测试工具还有:webbench、siege、http_load等。</p>]]></content>
<categories>
<category>计算机相关</category>
</categories>
<tags>
<tag>Linux</tag>
</tags>
</entry>
<entry>
<title>Ps -ef(aux) 各个字段解释</title>
<link href="/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/Ps%20-ef%EF%BC%88aux%EF%BC%89%20%E5%90%84%E4%B8%AA%E5%AD%97%E6%AE%B5%E8%A7%A3%E9%87%8A/"/>
<url>/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/Ps%20-ef%EF%BC%88aux%EF%BC%89%20%E5%90%84%E4%B8%AA%E5%AD%97%E6%AE%B5%E8%A7%A3%E9%87%8A/</url>
<content type="html"><![CDATA[<h1 id="ps-efaux-各个字段解释"><a class="markdownIt-Anchor" href="#ps-efaux-各个字段解释"></a> Ps -ef(aux) 各个字段解释</h1><ul><li>关于<code>ps -ef</code>的类似命令有:<code>ps -aux</code>和 <code>ps aux</code>,他们之间的区别,可参考:<ul><li><a href="https://blog.csdn.net/weixin_38756990/article/details/72638084?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-72638084-blog-108951021.235%5Ev38%5Epc_relevant_anti_vip&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-72638084-blog-108951021.235%5Ev38%5Epc_relevant_anti_vip&utm_relevant_index=1" target="_blank" rel="noopener">ps -ef 和ps -aux 和ps aux</a></li></ul></li></ul><h2 id="ps-ef-各个字段说明"><a class="markdownIt-Anchor" href="#ps-ef-各个字段说明"></a> ps -ef 各个字段说明</h2><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/image-20231030150713320.png" srcset="/img/loading.gif" lazyload alt="image-20231030150713320"></p><figure class="highlight objectivec"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs objectivec">其中各列的内容意思如下<br><span class="hljs-built_in">UID</span> <span class="hljs-comment">//用户ID、但输出的是用户名</span><br>PID <span class="hljs-comment">//进程的ID</span><br>PPID <span class="hljs-comment">//父进程ID</span><br>C <span class="hljs-comment">//进程占用CPU的百分比</span><br>STIME <span class="hljs-comment">// start time 启动时间</span><br>TIME <span class="hljs-comment">//该进程实际使用CPU运行的时间</span><br>TTY <span class="hljs-comment">//该进程在那个终端上运行,若与终端无关,则显示? 若为pts/0等,则表示由网络连接主机进程。</span><br><span class="hljs-built_in">CMD</span> <span class="hljs-comment">//命令的名称和参数</span><br></code></pre></td></tr></table></figure><ul><li>更多是结合 <code>grep</code> 使用</li></ul><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/image-20231030150854220.png" srcset="/img/loading.gif" lazyload alt="image-20231030150854220"></p><h2 id="ps-aux"><a class="markdownIt-Anchor" href="#ps-aux"></a> ps aux</h2><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/image-20231030151409337.png" srcset="/img/loading.gif" lazyload alt="image-20231030151409337"></p><ul><li>更多是结合 <code>grep</code>使用</li></ul><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/image-20231030151547335.png" srcset="/img/loading.gif" lazyload alt="image-20231030151547335"></p><figure class="highlight cos"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><code class="hljs cos">同ps -ef 不同的有列有<br>USER <span class="hljs-comment">//用户名</span><br><span class="hljs-built_in">%CPU</span> <span class="hljs-comment">//进程占用的CPU百分比</span><br><span class="hljs-built_in">%MEM</span> <span class="hljs-comment">//占用内存的百分比</span><br>VSZ <span class="hljs-comment">//该进程使用的虚拟內存量(KB)</span><br>RSS <span class="hljs-comment">//该进程占用的固定內存量(KB)(驻留中页的数量)</span><br>STAT <span class="hljs-comment">//进程的状态</span><br>START <span class="hljs-comment">//该进程被触发启动时间</span><br>TIME <span class="hljs-comment">//该进程实际使用CPU运行的时间</span><br><br>其中STAT状态位常见的状态字符有<br> <span class="hljs-keyword">D</span> <span class="hljs-comment">//无法中断的休眠状态(通常 IO 的进程);</span><br> <span class="hljs-keyword">R</span> <span class="hljs-comment">//正在运行可中在队列中可过行的;</span><br> <span class="hljs-keyword">S</span> <span class="hljs-comment">//处于休眠状态;</span><br> T <span class="hljs-comment">//停止或被追踪;</span><br> <span class="hljs-keyword">W</span> <span class="hljs-comment">//进入内存交换 (从内核2.6开始无效);</span><br> <span class="hljs-keyword">X</span> <span class="hljs-comment">//死掉的进程 (基本很少见);</span><br> Z <span class="hljs-comment">//僵尸进程;</span><br> < <span class="hljs-comment">//优先级高的进程</span><br> N <span class="hljs-comment">//优先级较低的进程</span><br> <span class="hljs-keyword">L</span> <span class="hljs-comment">//有些页被锁进内存;</span><br> <span class="hljs-keyword">s</span> <span class="hljs-comment">//进程的领导者(在它之下有子进程);</span><br> <span class="hljs-keyword">l</span> <span class="hljs-comment">//多线程,克隆线程(使用 CLONE_THREAD, 类似 NPTL pthreads);</span><br> + <span class="hljs-comment">//位于后台的进程组;</span><br></code></pre></td></tr></table></figure>]]></content>
<categories>
<category>计算机相关</category>
</categories>
<tags>
<tag>Linux</tag>
</tags>
</entry>
<entry>
<title>conda使用总结</title>
<link href="/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/conda%E4%BD%BF%E7%94%A8%E6%80%BB%E7%BB%93/"/>
<url>/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/conda%E4%BD%BF%E7%94%A8%E6%80%BB%E7%BB%93/</url>
<content type="html"><![CDATA[<h2 id="1conda使用总结"><a class="markdownIt-Anchor" href="#1conda使用总结"></a> 1.conda使用总结</h2><p>conda在Python中进行环境管理和包管理具有非常大的优势,在此记录conda相关命令。</p><h3 id="11-conda-启动退出虚拟环境"><a class="markdownIt-Anchor" href="#11-conda-启动退出虚拟环境"></a> 1.1 conda 启动\退出虚拟环境</h3><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs sh">$ conda activate 虚拟环境名<br><br>$ conda deactivate<br></code></pre></td></tr></table></figure><h3 id="12-conda-查看虚拟环境"><a class="markdownIt-Anchor" href="#12-conda-查看虚拟环境"></a> 1.2 conda 查看虚拟环境</h3><ul><li>查看所有的虚拟环境</li></ul><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs applescript">conda env <span class="hljs-built_in">list</span><br></code></pre></td></tr></table></figure><ul><li>查看当前虚拟环境中安装的包以及包版本</li></ul><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs applescript">conda <span class="hljs-built_in">list</span><br></code></pre></td></tr></table></figure><h3 id="13-利用conda-创建虚拟环境"><a class="markdownIt-Anchor" href="#13-利用conda-创建虚拟环境"></a> 1.3 利用conda 创建虚拟环境</h3><ul><li>创建空虚拟环境:</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs shell"><span class="hljs-meta">#</span><span class="bash"> 完全创建一个空的虚拟环境</span><br>conda create -n 虚拟环境名<br><br><span class="hljs-meta">#</span><span class="bash"> 完全创建一个空的虚拟环境,同时指定Python的版本为3.6.5</span><br>conda create -n 虚拟环境名 python=3.6.5<br></code></pre></td></tr></table></figure><ul><li>创建和base环境相同的虚拟环境</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">conda create -n 虚拟环境名 --clone base<br></code></pre></td></tr></table></figure><ul><li>在不同环境安装\卸载需要使用的包</li></ul><figure class="highlight properties"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs properties"><span class="hljs-attr">pip3</span> <span class="hljs-string">install 指定的包</span><br><br><span class="hljs-attr">pip3</span> <span class="hljs-string">uninstall 指定的包</span><br></code></pre></td></tr></table></figure><blockquote><p>注意:创建不同的虚拟环境,主要目标是为了隔离不同的环境,在A虚拟环境安装的包,并不会出现在B虚拟环境中。</p><p>通过:<code>pip3 install pyttsx3</code> 在prod虚拟环境中安装了 pyttsx3 包,该包只会在prod虚拟环境中出现,而不会在base虚拟环境中出现,相反也是一样。</p></blockquote><h3 id="14-利用conda-删除虚拟环境"><a class="markdownIt-Anchor" href="#14-利用conda-删除虚拟环境"></a> 1.4 利用conda 删除虚拟环境</h3><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sh">conda remove -n 虚拟环境名 --all<br></code></pre></td></tr></table></figure><h2 id="2conda配置国内镜像源"><a class="markdownIt-Anchor" href="#2conda配置国内镜像源"></a> 2.conda配置国内镜像源</h2><h3 id="21-conda配置清华镜像源"><a class="markdownIt-Anchor" href="#21-conda配置清华镜像源"></a> 2.1 conda配置清华镜像源</h3><ol><li><p>查看镜像源<br><code>conda config --show channels</code></p></li><li><p>删除添加源,恢复默认源<br><code>conda config --remove-key channels</code></p></li><li><p>添加清华镜像源</p><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs vim">#添加镜像源<br>conda config --<span class="hljs-built_in">add</span> channels http<span class="hljs-variable">s:</span>//mirrors.tuna.tsinghua.edu.<span class="hljs-keyword">cn</span>/anaconda/pkgs/main<br>conda config --<span class="hljs-built_in">add</span> channels http<span class="hljs-variable">s:</span>//mirrors.tuna.tsinghua.edu.<span class="hljs-keyword">cn</span>/anaconda/pkgs/free<br>conda config --<span class="hljs-built_in">add</span> channels http<span class="hljs-variable">s:</span>//mirrors.tuna.tsinghua.edu.<span class="hljs-keyword">cn</span>/anaconda/pkgs/r<br>conda config --<span class="hljs-built_in">add</span> channels http<span class="hljs-variable">s:</span>//mirrors.tuna.tsinghua.edu.<span class="hljs-keyword">cn</span>/anaconda/pkgs/<span class="hljs-keyword">pro</span><br>conda config --<span class="hljs-built_in">add</span> channels http<span class="hljs-variable">s:</span>//mirrors.tuna.tsinghua.edu.<span class="hljs-keyword">cn</span>/anaconda/pkgs/msys2<br><br>#终端显示包从哪个channel下载,以及下载地址是什么<br>conda config --<span class="hljs-keyword">set</span> show_channel_urls yes<br></code></pre></td></tr></table></figure></li></ol><h3 id="22-pip配置清华镜像源"><a class="markdownIt-Anchor" href="#22-pip配置清华镜像源"></a> 2.2 Pip配置清华镜像源</h3><h4 id="a临时使用清华镜像源"><a class="markdownIt-Anchor" href="#a临时使用清华镜像源"></a> a.临时使用清华镜像源</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-comment"># 代码如下(示例):</span><br><span class="hljs-comment"># some-package代表你需要安装的包</span><br>pip <span class="hljs-keyword">install</span> -i https://pypi.tuna.tsinghua.edu.cn/simple <span class="hljs-keyword">some</span>-<span class="hljs-keyword">package</span><br><br><span class="hljs-comment"># 下面这种方式也是一样的</span><br>pip <span class="hljs-keyword">install</span> <span class="hljs-keyword">some</span>-<span class="hljs-keyword">package</span> -i https://pypi.tuna.tsinghua.edu.cn/simple<br></code></pre></td></tr></table></figure><h4 id="b永久配置"><a class="markdownIt-Anchor" href="#b永久配置"></a> b.永久配置</h4><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs vim">pip config <span class="hljs-keyword">set</span> <span class="hljs-keyword">global</span>.<span class="hljs-built_in">index</span>-url http<span class="hljs-variable">s:</span>//pypi.tuna.tsinghua.edu.<span class="hljs-keyword">cn</span>/simple<br></code></pre></td></tr></table></figure><h3 id="23-国内常用的镜像源"><a class="markdownIt-Anchor" href="#23-国内常用的镜像源"></a> 2.3 国内常用的镜像源</h3><figure class="highlight groovy"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs groovy">pip install -i <span class="hljs-string">https:</span><span class="hljs-comment">//mirrors.aliyun.com/pypi/simple/ some-package</span><br><br>清华大学开源软件镜像站:<span class="hljs-string">https:</span><span class="hljs-comment">//pypi.tuna.tsinghua.edu.cn/simple</span><br>阿里云开源镜像站:<span class="hljs-string">https:</span><span class="hljs-comment">//mirrors.aliyun.com/pypi/simple/</span><br>豆瓣:<span class="hljs-string">https:</span><span class="hljs-comment">//pypi.douban.com/simple/</span><br>中国科技大学 <span class="hljs-string">https:</span><span class="hljs-comment">//pypi.mirrors.ustc.edu.cn/simple/</span><br></code></pre></td></tr></table></figure><h2 id="参考资料"><a class="markdownIt-Anchor" href="#参考资料"></a> 参考资料</h2><p><a href="https://lguduy.github.io/2021/02/26/Conda%E7%9A%84%E7%AE%80%E5%8D%95%E5%AE%9E%E7%94%A8%E6%80%BB%E7%BB%93/" target="_blank" rel="noopener">https://lguduy.github.io/2021/02/26/Conda的简单实用总结/</a></p>]]></content>
<categories>
<category>计算机相关</category>
</categories>
<tags>
<tag>Linux</tag>
</tags>
</entry>
<entry>
<title>State of GPT</title>
<link href="/chatGPT/chatGPT/State%20of%20GPT/"/>
<url>/chatGPT/chatGPT/State%20of%20GPT/</url>
<content type="html"><![CDATA[<h1 id="state-of-gpt"><a class="markdownIt-Anchor" href="#state-of-gpt"></a> State of GPT</h1><blockquote><p>英文视频地址:<a href="https://youtu.be/bZQun8Y4L2A" target="_blank" rel="noopener">https://youtu.be/bZQun8Y4L2A</a></p><p>中文视频地址:<a href="https://www.bilibili.com/video/BV1ts4y1T7UH/?vd_source=7a3f24059c1b6cfb7703e458a0a9f35b" target="_blank" rel="noopener">https://www.bilibili.com/video/BV1ts4y1T7UH/?vd_source=7a3f24059c1b6cfb7703e458a0a9f35b</a></p></blockquote><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/image-20230601183223453.png" srcset="/img/loading.gif" lazyload alt="image-20230601183223453"></p><h2 id="1如何训练-gpt"><a class="markdownIt-Anchor" href="#1如何训练-gpt"></a> 1.如何训练 GPT?</h2><p>首先,我们概括性地看看 GPT 大模型的训练流程。要记住,这是个新领域,变化很快。现在的流程是这样,以后新技术出现时可能会不一样。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183114193.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>可以看到,GPT 的训练流程可粗略分为四个阶段:预训练、监督式微调、奖励建模、强化学习。</p><p>这四个阶段按顺序进行。每个阶段都有各自的数据集,每个阶段也有各自用于训练神经网络的算法。第三行是所得到的模型。最后底部有一些备注信息。</p><p>在所有阶段中,预训练阶段所需的计算量是最大的,可以说 99% 的训练计算时间和浮点运算量都集中在这个阶段。因为这一阶段需要处理超大规模的互联网数据集,可能需要数千 GPU 构成的超级计算机工作几个月时间。其它三个阶段都算是微调(fine tuning)阶段,所需的 GPU 数量和训练时间都少得多。</p><p>下面我们将分阶段详解 GPT 的整个训练流程。</p><h3 id="11-预训练阶段"><a class="markdownIt-Anchor" href="#11-预训练阶段"></a> 1.1 预训练阶段</h3><p>预训练阶段的目标是得到一个基础模型。</p><p>首先第一步:数据收集。这一阶段需要海量的数据,下面给出了一个例子,这是来自 Meta 的 LLaMA 模型的数据混合(data mixture)方法:</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183114309.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>可以看到,LLaMA 的预训练数据按不同比例混用了多个不同类型的数据集,其中比例最大的是爬取自互联网的 CommonCrawl 以及基于 CommonCrawl 构建的 C4,此外还有 GitHub、维基百科等数据集。</p><p>收集到这些数据之后,还需要对它们进行预处理,这一步也被称为「token 化」。简单来说,这就是一个转译过程,即把原始文本转译成某种整数序列,因为这种整数序列就是 GPT 实际工作时所操作的本地表征。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183114415.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>这种从文本到 token 和整数的转译过程是无损的,而具体执行这一过程的算法有好几种。举个例子,如上图所示,我们可以使用一种名为字节对编码(byte pair encoding)的技术,其工作方式是迭代式地合并短文本块并将它们分组成 token。最后实际输入 Transformer 的就是那些整数序列。</p><p>下面来看两个示例模型 GPT-3 和 LLaMA 在预训练阶段需要考虑的一些主要的超参数。</p><blockquote><p>Karpathy 表示由于他们还没有发布有关 GPT-4 的相关信息,因此在演讲中使用了 GPT-3 的数据。</p></blockquote><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183114537.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>可以看到,词汇库的大小通常是 10000 数量级的;上下文长度通常为 2000 或 4000 左右,而现在更是有长达 10 万的。上下文长度决定着 GPT 在预测序列的下一个整数时所查看的最大整数数量。</p><p>对于参数数量,可以看到 GPT-3 的为 1750 亿,而 LLaMA 的为 650 亿,但实际上 LLaMA 的性能表现远胜于 GPT-3。原因何在?因为 LLaMA 训练的 token 要长得多,达到了 1.4 万亿,而 GPT-3 仅有大约 3000 亿。因此,评价一个模型时,光看参数数量是不够的。</p><p>上图中部的表格中给出了 Transformer 神经网络中一些需要设定的超参数,比如头的数量、维度大小、学习率、层数等等。</p><p>下方则是一些训练超参数;**比如为了训练 650 亿参数的 LLaMA 模型,Meta 使用 2000 个 GPU 训练了大约 21 天,资金成本大约为 500 万美元。**这大概能体现出预训练阶段各项成本的数量级。</p><p>接下来看实际的预训练过程究竟会发生什么。大致来说,首先会把 token 分批组成 data batch。这些分配数据构成数组,再被输入到 Transformer 中。这些数组的大小为 B×T;其中 B 是分批大小,即堆叠的独立样本的行数;T 是最大上下文长度。下图给出了一个示例。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183114770.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>在图中示例中,上下文长度 T 仅为 10,但实际模型的 T 可达到 2000 或 4000 乃至更长。也就是说,实际模型的一行数据可以非常长,比如一整个文档。我们可以将许多文档打包到各行中,并用这些特殊的文本结束 token <|endoftext|> 来分隔它们。简单来说,这些 token 是告诉 Transformer 新文档开始的位置。比如图中的 4 行文档就转换成了底部的 4×10 的数组。</p><p>现在,需要将这些数字输入到 Transformer。这里我们仅看其中一个单元格(绿色),而实际上每个单元格都会经历同样的处理流程。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183114848.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>这个绿色单元格会查看其之前的所有 token,即所有黄色单元格的 token。我们要将这里的全部上文输入到 Transformer 神经网络,Transformer 则需要预测出该序列的下一个 token,即图中的红色 token。</p><p>为了给出准确的预测,神经网络需要调整其上百亿个参数。每次调整后,神经网络对每个单元格 token 的预测分布就会不同。举个例子,如果词汇库的大小为 50257 个 token,那么我们就需要同样多的数字,以便得到下一个 token 的概率分布,其预测了下一个 token 的可能值及相应概率。</p><p>在图中的示例中,下一个单元格应该是 513,因此就可以将其用作监督源来更新 Transformer 的权重。我们可以并行地对每个单元格采取同样的操作。我们不断更换数据批,努力让 Transformer 有能力正确地预测序列的下一个 token。</p><p>下面再看一个更具体的示例。这是《纽约时报》用莎士比亚作品训练的一个小型 GPT。这里给出了莎士比亚作品中的一小段以及在其上训练 GPT 的情况。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183114963.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>首先,在 GPT 初始化时,权重是完全随机的,所以其输出结果也是完全随机的。随着时间推移,训练时间越来越长,GPT 不断迭代,模型给出的结果样本也就越来越连贯通顺了。最后,可以看到 Transformer 学到了一些有关词的东西,也知道应该在哪些地方放置空格了。</p><p>在实际预训练过程中,要通过一些量化指标来确定模型迭代中的表现变化。<strong>一般来说,研究者监测是损失函数。损失低说明 Transformer 更可能给出正确预测,即序列中下一个整数是正确值的概率更高。</strong></p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183115024.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>预训练其实就是一个语言建模过程,这个过程的训练时间可长达一个月。之后,GPT 学到了一个非常强大的通用型语言表征。然后我们可以针对具体的下游任务高效地对其进行微调。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183115112.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>举个例子,如果下游任务是情绪分类。过去,你采用的方法可能是收集大量标注好「正面」或「负面」情绪的样本,然后训练一个 NLP 模型。但现在的新方法不需要预先做情绪分类了,你只需要拿一个预训练过的大型语言模型,然后只需要少量示例样本,就能非常高效地针对你的具体任务对模型进行微调。</p><p>这对实际应用来说非常有用。那么为什么预训练后的大型语言模型(LLM)只需要简单微调就能用呢?这是因为语言建模过程本身就已经涵盖了大量任务 —— 模型为了预测下一个 token,必须理解文本的结构以及其中内含的各种不同概念。</p><p>这就是 GPT-1。</p><p>现在来看 GPT-2。人们注意到 GPT-2 甚至可以不用微调就能非常有效地让这些模型执行 prompt。这些语言模型的训练目标是完成文档,因此用户实际上只需通过编排适当的虚假文档,就可以诱导模型执行具体任务。下面给出了一个例子。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183115225.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>其中给出了一篇文章,用户想完成的任务是做相关的问答。因此,只需要在文章后面加几个有答案的问答(这被称为 few-shot prompt),然后再提问,那么由于 Transformer 的目标是完成这个文档,也就相当于回答了问题。这个例子是用 prompt 来调教基础模型,使其相信它在模仿一个文档,结果却完成了问答任务。</p><blockquote><p>Karpathy 认为,以提供 prompt 替代微调的方式昭示着大型语言模型的新时代。这让基础模型本身就足以应对许多不同类型的任务。</p></blockquote><p>也因此,相关领域的研究前沿就转向了基础模型的进化。各大研究机构和企业都在打造自己的基础大模型。不过这些模型并不都是公开可用的,比如 OpenAI 一直没有发布 GPT-4 基础模型。我们通过 API 调用的 GPT-4 模型其实并不是基础模型,而是一个助理模型(assistant model)。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183115312.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>GPT-3 基础模型可通过 DaVinci API 使用,GPT-2 基础模型也是公开的,用户甚至可以在 GitHub 上找到其参数权重配置:<a href="https://github.com/openai/gpt-2" target="_blank" rel="noopener">https://github.com/openai/gpt-2</a> 。不过总体而言,目前最开放的基础模型还是 Meta 的 LLaMA 系列模型,但该系列也没有授权给商业使用。</p><p>现在需要指出一点:基础模型不等于助理模型。基础模型不会回答用户提问,它们只会完成文档。所以如果你对基础模型说:「写一首关于面包和奶酪的诗」,你可能不会如愿 —— 它只会把你的要求看成一个文档,然后试图完成它。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183115446.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>但是,你可以通过适当的 prompt 诱导基础模型写诗,如上图右侧所示。</p><p>当然,你也可以诱导模型变成助理。为此,你需要创建一些特定的少样本 prompt,使其看起来像是人类与助理交换信息的交互过程的文档。如下图所示,然后你只需要在文档结尾处附上你的提问,基础模型就能在一定程度上化身为一个有用的助理,给出某个答案。但这个过程并不非常可靠,实践效果也不好。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183115503.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>因此,为了打造出真正的 GPT 助理,需要另外的方法,即监督式微调(supervised fine tuning,即 SFT)。</p><h3 id="12-监督式微调阶段"><a class="markdownIt-Anchor" href="#12-监督式微调阶段"></a> 1.2 监督式微调阶段</h3><p>在监督式微调阶段,需要收集少量但高质量的数据集。OpenAI 的方法是以人工方式收集由 prompt 和理想响应构成的数据。这些数据需要不少,一般需要几万个。</p><p>然后,继续在这些数据上执行语言建模。算法不变,只是换了训练数据集:从大量低质量的互联网文档换成了少量高质量的问答式「prompt - 响应」数据。</p><p>这个训练过程完成后,就得到了一个 SFT 模型。部署这些模型就能得到助理,它们已经能完成一定程度的工作。</p><p>依然来看个例子。这是人类合同工写出的数据,其中有一个 prompt,然后人类再写出理想的响应。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183115679.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>理想的响应自然不能让人随意发挥,而是需要遵循许多规则(如上右图),其中有格式上的要求并且要保证给出的答案有用、真实可信且无害。</p><p>接下来还需要基于人类反馈的强化学习(RLHF),其中包含奖励建模阶段和强化学习阶段。</p><h3 id="13-奖励建模阶段"><a class="markdownIt-Anchor" href="#13-奖励建模阶段"></a> 1.3 奖励建模阶段</h3><p>在这一阶段,需要将数据收集转变成比较的形式。这里给出了一个示例。对于同样的 prompt,要求助理写一个能检查给定字符串是否为回文的程序或函数。再使用已经训练好的 SFT 模型生成多个结果,这里给出了三个。然后再让人类给这些结果排名。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183115754.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>这件事做起来可并不简单,毕竟要是让人类来完成一个 prompt,可能需要耗费几个小时时间。现在假设排名完成了,然后就需要在这些结果的所有可能配对上执行类似二元分类的操作。</p><p>如下图所示,具体的做法是这样的:将 prompt 按行排列;这里的三行 prompt 是一样的,但完成的结果不同,即图中黄色 token(来自 SFT 模型)。然后在其后添加一个特殊的奖励读出 token。这样,只需要在绿色 token 位置对 Transformer 执行监督,就能使 Transformer 预测出某个奖励,从而判断 prompt 的完成结果是否优良。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183115822.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>这基本上就是让 Transformer 猜测每个完成结果的质量。当其猜测完每个不同结果的质量后,开发者就可以动用已有的基本真值(ground truth)强行让某些结果的质量分数高于其它结果,从而使模型的奖励预测结果与人工给出的基本真值保持一致。这个过程可以通过一个损失函数完成。</p><p>有了奖励模型之后,GPT 依然还不能成为一个有用的助理,但奖励模型却对后面的强化学习阶段很有用,因为奖励模型可以评估任意给定 prompt 的任意完成结果的质量。</p><h3 id="14-强化学习阶段"><a class="markdownIt-Anchor" href="#14-强化学习阶段"></a> 1.4 强化学习阶段</h3><p>强化学习阶段做的事情就是基于奖励模型,使用强化学习算法对大量 prompt 对应的结果进行评分。</p><p>这里以一个 prompt 为例,将 SFT 模型完成的结果(黄色)排列成行,然后在后面加上奖励 token(绿色)。这些奖励来自奖励模型,并且已经固定不变。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183115948.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>现在使用同样的语言建模损失函数,只是现在是在黄色 token 上训练,并根据奖励模型指示的奖励来重新权衡语言建模目标。</p><p>比如在第一行,奖励模型认为这个完成结果的评分相当高。因此,模型在第一行采样的所有 token 都会得到强化,也就是在未来会有更高的概率被采用。对比之下,奖励模型不喜欢第二个完成结果,给出了负分评价,因此该行的所有 token 在未来出现的概率就会降低。</p><p>如此这般在许多 prompt 上操作一遍又一遍,经过许多数据批次,就能得到一个创建黄色 token 的策略。依照这个策略,所有完成结果都能被奖励模型给予高分。</p><p>这就是 RLHF 的训练流程。最后得到的模型就可以部署成应用了。</p><p>ChatGPT 就是一个 RLHF 模型,而其它一些模型则可能是 SFT 模型,比如 Claude 等。</p><blockquote><p>那么 OpenAI 为什么要使用 RLHF 呢?</p><p>Karpathy 表示,原因很简单,使用 RLHF 能让模型表现更好。根据 OpenAI 之前做的一些实验,可以看到使用了 PPO(近端策略优化)算法的 RLHF 模型整体上都更好一些。当把结果提供给人类时,相比于 SFT 模型和通过 prompt 化身为助理的基础模型,人类也基本更喜欢来自 RLHF 模型的 token。</p></blockquote><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183116008.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>那 RLHF 为什么能让模型更好呢?目前 AI 研究界还没有找到一个得到大家认可的理论,但 Karpathy 还是给出了自己的见解。他认为这可能与比较和生成的计算难度之间的不对称性有关。</p><p>举个例子说明一下:假设我们要让一个模型写一首关于回形针的俳句。如果你是一位正努力创建训练数据的合同工,正在为 SFT 模型收集数据。那么你该怎样写出一首关于回形针的好俳句呢?而你可能并不是一位优秀的俳句诗人。但是,如果给你几首俳句,你却有能力辨别它们中哪首更好一些。也就是说,比起创建一个好样本,判断哪个样本更好是简单得多的任务。因此,这种不对称性可能使得比较是一种更好的方法 —— 能更好地利用人类的判断来创造出好一些的模型。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183116059.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>现在来看另一个方面:RLHF 并不总是会为基础模型带来提升。在某些情况下,RLHF 模型会失去一些熵,也就是说它们会输出更加单调、变化更少的结果。而基础模型的熵更高,可以输出更加多样化的结果。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183116216.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>比如下面的任务可能就更适合使用基础模型,即生成与已有的 n 个示例相似的东西。这里的示例任务是生成更多宝可梦名字。首先,用户向模型提供了 7 个宝可梦名字,然后让基础模型完成文档。基础模型生成了大量宝可梦名字。这些名字都是虚构的,毕竟宝可梦并不真实存在。Karpathy 认为这类任务使用基础模型会得到更好的结果,因为基础模型的熵更高,给出的结果既与之前的示例相似,又更加多样化和炫酷。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183116286.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>现在,用户可以使用的助理模型已有不少了。伯克利有个团队正对许多助理模型进行排名并给出了基本的 ELO 评分。当然,现目前最好的模型是 GPT-4;Claude 和 GPT-3.5 紧随其后。有些模型公开提供模型权重,比如 Vicuna、Koala 等。在这个榜单中,前三名都是 RLHF 模型,其它模型基本都是 SFT 模型。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183116396.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>上面就是训练模型的方式。下面调转方向,看看我们可以怎么将 GPT 助理模型应用于实际问题。</p><h2 id="2如何使用-gpt"><a class="markdownIt-Anchor" href="#2如何使用-gpt"></a> 2.如何使用 GPT?</h2><p>下面会通过实际示例来展示如何最好地使用 GPT。假设你在写一篇文章,需要在结尾加上这样一句:「California’s population is 53 times that of Alaska.」(加州的人口是阿拉斯加州的 53 倍)。但现在你不知道这两个州的人口数据,你需要智能助理来帮你。</p><p>人类会怎样完成这个任务呢?大致推想,人类很可能会经历一连串的思考过程,如下图所示:首先会想到为了得到结果,需要比较人口数量,那么就需要查询人口数据;然后使用查询工具查一下 —— 在维基百科上找到了加州和阿拉斯加的人口数据;接下来很显然需要做个除法运算,可能会需要计算器;然后得到倍数结果 53;然后我们的大脑可能会用经验理智快速检验一下 ——53 倍感觉挺合理的,毕竟加州是美国人口最多的州。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183116492.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>信息有了之后,就进入了创造性写作的部分。你可能首先会写下:「California has 53x times greater」,然后你想一下感觉又不太合适,又删了重新想哪种表达更合适一点,最终得到你满意的句子表达。</p><p>简单来说,为了写这样一句话,你的内心会经历大量独白式的思考。那么 GPT 在生成这样一句话时又会经历什么呢?</p><p>GPT 处理的都是 token 序列。不管是阅读还是生成,它都是按部就班地一块块地进行,其中每一块都是针对一个 token,计算工作量也都一样。这些 Transformer 的层数不少,足有 80 个推理层,但话说回来 80 也不是非常多。Transformer 会通过这些来尽力模仿写作,但其思考过程和人类的大不相同。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183116608.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>也就是说与人类不同,GPT 没有什么内心独白,它只会检视每一个 token 并在每个 token 上投入同等的计算量,仅此而已。它们就像是 token 模拟器 —— 它们不知道自己知道什么或不知道什么,只是模仿地写出下一个 token;它们也不会反思,内心不会思考结果是否合理;它们写错了也不会反过来修改。它们只是按序列采样 token。</p><blockquote><p>但即便如此,Karpathy 认为 GPT 依然具有某种形式的认知能力优势,比如它们具备非常广博的事实知识,涵盖许多不同领域,因为它们数以百亿计的参数,足以储存大量事实。同时它们还有相对来说很大且完美的工作记忆。只要能填入 Transformer 的上下文窗口,它就能通过其内部自注意机制来加以利用。也就是说 GPT 能以无损的方式记住能嵌入其上下文窗口的任何内容。</p></blockquote><p>Karpathy 表示:人类通过 prompt 使用 GPT 的过程本质上是大脑和 LLM 这两种不同的认知架构互相配合的过程。</p><h3 id="21-用-gpt-执行推理"><a class="markdownIt-Anchor" href="#21-用-gpt-执行推理"></a> 2.1 用 GPT 执行推理</h3><p>再来看 Transformer 在实践中表现相当好的一种用例:推理。</p><p>如果只有单个 token,当然不能指望 Transformer 推理出什么。推理的执行需要涉及更多 token。比如,你不能向 Transformer 提一个非常复杂的问题,然后指望它通过单个 token 就找到答案。Transformer 需要通过 token 来「思考」。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183116671.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>上图右侧给出了一个例子。可以在输出结果中看到 Transformer 为了解答问题而进行的「思考」。如果你提供了一些示例(上方) ,那么 Transformer 就会模仿那个模板,结果看起来相当不错。当然,你也可以通过说「Let’s think step by step」(请按步骤解答)引导 Transformer 给出类似的输出 —— 这在某种程度上展示了其工作过程。而且由于它有点像是进入了工作过程展示模式,那么其在每个单独 token 上投入的计算量就会少一点。这样一来,它执行的就是一个速度更慢的推理过程,也就更可能成功得到正确答案。</p><p>再看一例。如下图所示,人类写作时会写不好,类似地,Transformer 在选择下一个 token 时可能会出错,但不同于人类可以及时停下进行修改,Transformer 会继续生成,一错到底,最终得到错误答案。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183116798.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>但类似于人类写作时没写好可以重来一样,Transformer 也可以多次采样,然后我们可以使用某个过程找到其中较好的。这被称为自我一致性(self-consistency)。</p><p>有趣的是,通过让模型反思(reflection),可以发现模型其实能知道自己出错了。举个例子,如果让 GPT-4 生成一首不押韵的诗然后它生成的诗却押韵了。然后你只需要问它「你完成任务了吗?」它就会知道自己没有完成任务,然后为你重新完成任务。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183116908.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>但如果你不给出那样的 prompt,它就不知道自己错了。它并不会自己去回顾,毕竟它只是一个 token 模拟器。你必须通过 prompt 让它回顾。</p><p>Karpathy 表示可以按照目的将 AI 模型分为两种:一类系统(System 1)和二类系统(System 2)。一类系统的处理过程速度快并且是自动化的,对应于只是采样 token 的大型语言模型。而二类系统的速度慢一些,会反复思考进行规划。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183117015.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>现在有很多人在通过设计 prompt 来让 LLM 表现出类似人类大脑的思维过程。如上左图 (d) 所示,这是近期一篇论文提出的 Tree of Thought(思维树)。该论文提出为任意给定 prompt 维持多个完成结果,然后对这些结果进行评分,保留得分较好的结果。</p><p>要做到这一点,不只要用一个 prompt,而是需要用 Python Glue 代码将多个 prompt 组合到一起。这实质上是维持多个 prompt,还需要执行某个树搜索算法来找到可扩展的 prompt。可以说这是 Python Glue 代码与各个 prompt 组成的共生体。</p><p>Karpathy 在这里类比了 AlphaGo。AlphaGo 的每一步都是下接下来的一步棋,其策略的训练方式最初是模仿人类。但除了这个策略之外,它还会执行蒙特卡洛树搜索。由此造成的结果是,AlphaGo 会在头脑里尝试大量不同的可能性然后对它们进行评估,最后仅保留其中效果好的。思维树就有点像是 AlphaGo 下围棋时的思维过程,只不过处理的是文本。</p><p>不只是思维树,现在也有更多人在实验让 LLM 完成比简单问答更加复杂的任务,但很多都像是 Python Glue 代码,将许多 prompt 连接起来。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183117125.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>上图给出了两个例子。其中右图的论文提出了 ReAct,研究者是将 prompt 的答案构造成一个思维、动作、观察构成的序列,其中在动作部分,模型还能使用工具。这就像是某种回答查询的思维过程。</p><p>左图则是 AutoGPT。这个项目最近有些炒作,但也确实是很有趣的研究。AutoGPT 能够保存一个任务清单并递归式地分解这些任务。目前来说这种做法的效果并不很好,Karpathy 也不建议人们将其用于实际应用,但他表示从研究角度看,这种方法还是很有启发性。</p><p>以上就是创造二类系统思维方式的一些研究成果。</p><p>Karpathy 接下来谈到了 LLM 的另一个有趣现象,他说:「LLM 就好像有种心理怪癖。它们不想成功,只想模仿。」你想要它给出正确答案,你就要明确要求它。这是因为 Transformer 的训练数据集中数据并不总是正确的,也存在低质量的数据。</p><p>举个例子,假如有某个物理问题,数据集中可能有某个学生给出的错误答案,同时也会有某个专家给出的正确答案。而 Transformer 不知道该模仿哪个或者说它都想模仿,毕竟它们的训练目标是语言建模,不是分辨对错。因此在使用和测试时,如果你想要正确答案,你就要明确提出要求。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183117216.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>比如在上图的论文中,研究者尝试了多种不同的 prompt,发现对于同一问题,不同 prompt 得到的输出结果准确度竟然不一样!可以看到,如果在 prompt 中明确要求模型一步步推理并给出正确结果,其准确度会高一些,因为这样 Transformer 就不必再为低质量解答分配概率了。</p><p>因此,如果你想要正确答案,就大声说出来!像是在 prompt 中添加「你是某领域的专家」或「假设你的 IQ 为 120」。但是也不要太过了,比如要求模型假设自己的 IQ 为 400,这样的话你的问题可能会超出数据的分布或者虽在分布中但结果却很科幻 —— 这样模型可能就会开始扮演什么科幻角色了。</p><h3 id="22-让-llm-使用工具-插件"><a class="markdownIt-Anchor" href="#22-让-llm-使用工具-插件"></a> 2.2 让 LLM 使用工具 / 插件</h3><p>针对具体问题,使用合适的工具往往能事半功倍。对 LLM 来说也是如此。根据具体任务的不同,我们可能希望 LLM 能使用计算器、代码解释器、搜索引擎等工具。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183117355.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>但首先我们需要记住一点:Transformer 默认情况下可能并不知道它们无法做到某些事情。用户甚至可能需要在 prompt 中明确告知 Transformer:「你不擅长心算,如果要做大数运算,请使用这个计算器,这是使用这个计算器的方法。」你必须明确要求它使用某个工具,因为模型自身不知道自己擅长或不擅长什么。</p><p>检索是能极大提升 LLM 性能的重要工具。因为 LLM 是专精于记忆的(memory only),因此专精于检索的搜索引擎能为 LLM 提供极大补充。实践也证明,能使用检索工具的 LLM 的实用性会大大提升。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183117432.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>之前已经提到,Transformer 的上下文窗口就是其工作记忆范围。如果能在其工作记忆中载入与当前任务相关的信息,那么模型的表现就会更好,因为模型能够立即读取所有记忆。实际上用检索增强生成也是很多人感兴趣的课题。上图下方展示了 LlamaIndex,其中有一个连接大量不同类型数据的数据连接器。这个工具可以索引各种数据并将它们提供给 LLM 使用。</p><p>现在时兴的做法是:选取相关文档,然后将其分成文本块,再执行嵌入操作,得到表示那些数据的嵌入向量。这些嵌入向量会被保存起来。当使用模型时,我们可以向存储的向量发出查询,从中取用与当前任务相关的文本块。然后将这些文本块加入到 prompt,再让 LLM 生成。这种做法在实践中的效果很好。</p><p>这其实与人类完成任务的方法类似。人也可以仅靠自己的记忆做事,但如果能检索到与任务相关的资料,做起事来也自然会更容易。Transformer 虽然记忆广博,但也能从检索中受益。</p><h3 id="23-在-prompt-中添加约束条件"><a class="markdownIt-Anchor" href="#23-在-prompt-中添加约束条件"></a> 2.3 在 prompt 中添加约束条件</h3><p>在 prompt 中设定约束条件能迫使 LLM 按特定模板输出结果。下图给出了微软帮助用户更好使用 LLM 的 Guidance 工具,具体可访问 <a href="https://github.com/microsoft/guidance" target="_blank" rel="noopener">https://github.com/microsoft/guidance</a> 。在这里给出的例子中,LLM 输出的结果会是 JSON 格式。这是可以得到保证的,因为 prompt 会调整 Transformer 输出不同 token 的概率,而这些 token 的输出位置受限了,即只能填补文本中的空缺位置。这样就实现了对文本留空处的严格限制。带约束条件的采样对某些任务来说非常有用。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183117537.png" srcset="/img/loading.gif" lazyload alt="图片"></p><h3 id="24-微调"><a class="markdownIt-Anchor" href="#24-微调"></a> 2.4 微调</h3><p>通过设计 prompt 能让 LLM 模型完成更多不同任务,但我们其实也能通过微调来做到这一点。</p><p>对模型进行微调是指改变模型的权重分布。这种事情做起来不难,因为现在已经有 LLaMA 等开源的大模型以及一些用于微调的软件库。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183117610.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>比如 LoRA 等参数高效型微调技术让用户可以仅训练模型中少量稀疏的部分。使用该技术时,基础模型的大部分都保持不变,而某些部分可以变化。在实践中,这种技术用起来很不错,能让人以很低的成本对模型做少量调整。同时,因为模型大部分都是固定不变的,所以可以使用非常低精度的推理来计算那些部分,因为梯度下降不会更新它们。由此,整体的微调效率就能非常高。</p><p>不过需要记住,微调需要专业技术,而且多半还需要相应的专业领域知识,毕竟不管是雇佣人类专家来编写数据集还是通过自动方法合成数据都非常复杂,而这也会拉长迭代周期。</p><blockquote><p>另外,Karpathy 还指出,对用户来说,监督式微调(SFT)还是可以做到的,因为这其实就是继续执行语言建模任务;但 RLHF 是还需进一步研究的课题,实现难度就大多了,因此不建议初学者来做。</p></blockquote><h3 id="25-karpathy-的-gpt-使用"><a class="markdownIt-Anchor" href="#25-karpathy-的-gpt-使用"></a> 2.5 Karpathy 的 GPT 使用</h3><p>为了帮助人们更好使用 GPT,Karpathy 给出了一些建议。在使用 GPT 来完成任务时,可以将任务分成两个部分:一,取得最佳结果;二,依照指定顺序优化结果。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183117775.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>对于第一部分,首先是选模型,目前最强的模型是 GPT-4。有了模型后,当执行具体任务时,你需要把 prompt 设计得足够详细,其中要包含任务的背景、相关信息和说明。你要想一想人类会怎么完成这一任务,但你同时也要明白人类有内心独白、能够自省,LLM 却不行。了解 LLM 的工作方式对设计 prompt 大有裨益。你可以检索一些相关背景和信息并将其添加到 prompt 中。网上已有不少人分享过相关经验和技术。</p><p>你不用急于让 LLM 一步到位完成你的任务。可以多做几次实验,测试一下各种可能性。你可以向 LLM 提供一些例子,让它真正理解你的意图。</p><p>对于原生 LLM 难以解决的问题,可以将其交给工具和插件处理。你要想想如何将工具整合进来,这当然无法通过单个 prompt 问答就可以解决。你需要多做几次实验,实践出真知。</p><p>最后,如果你成功搞出了适合自己的 prompt 设计方案,你可以再继续坚持一下,看看可以如何对模型进行微调以更好地服务你的应用;但要明白微调模型的速度会更慢,也需要投入更多。对于想要使用 RLHF 的研究型专家来说,虽然如果真能用起来,RLHF 目前是会比 SFT 好一些,但成本也会更高。为了节省成本,探索性研究可以使用性能更低的模型或更短的 prompt。</p><p>Karpathy 强调用 LLM 解决用例时可能会出现一些问题,比如结果可能有偏见、编造出幻觉信息、推理错误、无法理解应用类型(比如拼写相关任务)、知识隔断(GPT-4 的训练数据截止于 2021 年 9 月)、可能会被攻击(比如 prompt 注入攻击、越狱攻击、数据毒化攻击)……</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183117862.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>Karpathy 建议用户目前仅在低风险程度的应用中使用 LLM 并且要搭配人工监督一起使用。LLM 可以作为灵感和建议来源,让它们辅助我们而不是完全自主地替代我们工作。</p><h2 id="3结语"><a class="markdownIt-Anchor" href="#3结语"></a> 3.结语</h2><p>Karpathy 在总结时说:「GPT-4 是了不起的造物。我很感激它存在于世而且它很美丽。」它具有非凡的能力,能帮助用户解答疑问、编写代码等等。围绕它的生态系统也正在蓬勃发展。</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183117973.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>最后,Karpathy 向 GPT-4 提了一个问题:「如果要激励 Microsoft Build 2023 的观众,你会说点什么?」</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183118022.png" srcset="/img/loading.gif" lazyload alt="图片"></p><p>GPT-4 给出了如下回答:</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183118127.png" srcset="/img/loading.gif" lazyload alt="图片">请 ChatGPT 将这段话翻译成了汉语:</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/640-20230601183118190.png" srcset="/img/loading.gif" lazyload alt="图片"></p>]]></content>
<categories>
<category>chatGPT</category>
</categories>
<tags>
<tag>chatGPT</tag>
</tags>
</entry>
<entry>
<title>GPT-4 幻觉问题(hallucinations)</title>
<link href="/chatGPT/chatGPT/GPT-4%20%E5%B9%BB%E8%A7%89%E9%97%AE%E9%A2%98%EF%BC%88hallucinations%EF%BC%89/"/>
<url>/chatGPT/chatGPT/GPT-4%20%E5%B9%BB%E8%A7%89%E9%97%AE%E9%A2%98%EF%BC%88hallucinations%EF%BC%89/</url>
<content type="html"><![CDATA[<h1 id="gpt-4-幻觉问题hallucinations"><a class="markdownIt-Anchor" href="#gpt-4-幻觉问题hallucinations"></a> GPT-4 幻觉问题(hallucinations)</h1><h2 id="1-什么是-gpt-4的幻觉问题"><a class="markdownIt-Anchor" href="#1-什么是-gpt-4的幻觉问题"></a> 1. 什么是 GPT-4的幻觉问题</h2><p>GPT-4是OpenAI最先进的多模态模型,能够在各种基准测试中表现出人类水平 。但它也有幻觉问题(hallucinations),即生成一些错误或无意义的内容 。这可能会误导用户,损害GPT-4的信誉和可靠性,甚至造成风险和危害。这种现象被称为幻觉,因为它们类似于人类在感知事物时,看到或听到一些不存在或与现实相悖的东西。</p><p>OpenAI 自己进行的答案真实性测试中, gpt-4 准确率在70%-80%之间,chatgpt-v4准确率在50%-60%之间, 因为测试集是特定构造的,具有相对意义,OpenAI结论是:“GPT-4 scores 40% higher than our latest GPT-3.5 on our internal adversarial factuality evaluations”</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/imageDownloadAddress.png" srcset="/img/loading.gif" lazyload alt="img"></p><h2 id="2-为什么会有-gpt-4的幻觉问题"><a class="markdownIt-Anchor" href="#2-为什么会有-gpt-4的幻觉问题"></a> 2. 为什么会有 GPT-4的幻觉问题</h2><p>GPT-4的幻觉问题主要有三个原因:</p><ul><li><strong>数据噪声</strong>:GPT-4从互联网上收集的数据中学习,但这些数据并不都是准确或高质量的。</li><li><strong>模型局限</strong>:GPT-4在某些领域或任务上还没有达到人类水平,甚至低于人类水平。</li><li><strong>用户指令</strong>:用户提供的指令或请求可能不清晰、合理或可行,导致GPT-4无法正确地回应。</li></ul><h2 id="3-gpt-4的幻觉问题有哪些影响"><a class="markdownIt-Anchor" href="#3-gpt-4的幻觉问题有哪些影响"></a> 3. GPT-4的幻觉问题有哪些影响</h2><p>GPT-4的幻觉问题可能会对用户、开发者和社会产生不利影响:</p><ul><li><strong>用户体验</strong>:GPT-4的幻觉问题可能会降低用户对GPT-4的信任和满意度,影响用户体验。</li><li><strong>开发者责任</strong>:GPT-4的幻觉问题可能会增加开发者的责任和风险,要求开发者更加谨慎和负责地使用和部署GPT-4 。</li><li><strong>社会影响</strong>:GPT-4的幻觉问题可能会对社会造成负面影响,挑战社会的价值和规范 。</li></ul><h2 id="4-gpt-4-幻觉问题的模型层面原因分析"><a class="markdownIt-Anchor" href="#4-gpt-4-幻觉问题的模型层面原因分析"></a> 4. GPT-4 幻觉问题的模型层面原因分析</h2><p>GPT 系列模型本质能力是预测下一个词是什么,这样就使其全局规划的能力。</p><ul><li>例子1</li></ul><p>第一个问题回答错误</p><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/example1.png" srcset="/img/loading.gif" lazyload alt="img"></p><p>但是如果我们让其列出所有数字,然后计数,它可以给出正确答案。</p><p><img src="/images/imageDownloadAddress?attachId=98de1ec837024cbe997e4b7a2f4f3d4b&docGuid=k4EvXjIHJSKTUJ.png" srcset="/img/loading.gif" lazyload alt="img"></p><ul><li>例子2</li></ul><p>GPT-4 直接回答如下这种简单算术题只有58%的正确率,</p><p><img src="../../images/imageDownloadAddress?attachId=1b174293e2dd409bbd224013bba4407b&docGuid=k4EvXjIHJSKTUJ.png" srcset="/img/loading.gif" lazyload alt="img"></p><p>然而,如果GPT-4“慢慢来”回答这个问题,那么准确率很容易就会上升。例如,如果我们要求模型使用以下提示写下中间步骤:</p><p>以下表达式的值是多少?116 * 114 + 178 * 157 = ? 让我们一步一步地思考如何求解表达式,记下所有中间步骤,然后得出最终解。</p><p>则当数字在区间1−40内时,准确度会达到100%,而在区间1–200内,准确度则会达到90%。</p><ul><li>例子3</li></ul><p><img src="../../images/imageDownloadAddress?attachId=ca314a9f3c0841d6ba9b440b0f35cca3&docGuid=k4EvXjIHJSKTUJ.png" srcset="/img/loading.gif" lazyload alt="img"></p><p>这些例子说明了下一个词预测范式的一些局限性,这些局限性表现为模型缺乏规划、工作记忆、回溯和推理能力。模型依赖于一个局部和贪婪的过程来生成下一个词,而没有对任务或输出的全局或深入的理解。因此,模型擅长生成流畅和连贯的文本,但在解决复杂或创造性的问题方面有局限性,这些问题不能以顺序的方式来处理,因而我们可以对任务进行如下分类:</p><table><thead><tr><th>任务类型</th><th>定义</th><th>例子</th></tr></thead><tbody><tr><td>渐进式任务</td><td>可以通过逐渐添加有助于解决问题的词或句子来完成的任务,不需要太多的创造力或洞察力,而只需要运用已有的知识和技能。</td><td>写一篇文本的摘要,回答事实性问题,根据给定的押韵方案创作一首诗,或者解决一个遵循标准程序的数学问题。</td></tr><tr><td>非连续性任务</td><td>不能通过逐渐添加词或句子来完成的任务,而需要一个突破性的想法来解决问题,需要发现或创造一种新的视角或框架。</td><td>解决一个需要对公式进行新颖或创造性应用的数学问题,写一个笑话或一个谜语,提出一个科学假设或一个哲学论证,或者创造一种新的写作体裁或风格。</td></tr></tbody></table><p>当前GPT对渐进式任务能处理的很好, 而对非连续性任务则比较困难。 模型在执行需要提前规划或需要一个“灵光一闪”的创意的任务时,表现出困难,换句话说,模型在需要人类天才那种形式的概念跳跃的任务上,表现不佳。</p><h2 id="4-如何应对-gpt-4的幻觉问题"><a class="markdownIt-Anchor" href="#4-如何应对-gpt-4的幻觉问题"></a> 4. 如何应对 GPT-4的幻觉问题</h2><p>针对GPT-4的幻觉问题,我们可以从以下四个方面采取应对措施:</p><h4 id="通用方法"><a class="markdownIt-Anchor" href="#通用方法"></a> 通用方法</h4><ul><li><strong>数据处理</strong>:通过清洗和扩充数据,提高数据的质量和覆盖度,为模型提供更好的学习材料。</li><li><strong>模型优化</strong>:通过改进、评估和对齐模型,增加模型的深度、宽度、复杂度和对齐度,提升模型的能力、常识、问题解决和安全性,并使用对抗测试或人工评估检测和纠正模型的错误输出。</li><li><strong>用户交互</strong>:通过引导和监督用户,提供清晰、合理、可行和安全的指令或请求,减少沟通障碍,提高用户体验和满意度。</li><li><strong>多模态输入</strong>:通过结合图像和文本信息,提高模型的语义理解和表达能力。</li></ul><h4 id="我们重点关注的"><a class="markdownIt-Anchor" href="#我们重点关注的"></a> 我们重点关注的</h4><ul><li><strong>改善模型校准</strong>:让模型能够评估自己的信心水平,当它不确定答案时,要么不回答,要么给出一个信心区间或概率。</li><li><strong>插入外部信息</strong>:让模型能够利用其他的信息源,如搜索引擎、知识库、数据库等,来补充自己缺乏的知识,避免编造事实。</li><li><strong>后期检查</strong>:让模型在生成内容后,对其进行一些逻辑或事实的检验,发现并纠正可能的错误或矛盾。</li><li><strong>优化用户体验</strong>:让模型在与用户交互时,明确表达自己的能力和局限,提醒用户注意可能的幻觉,引导用户进行合理的使用和判断。</li></ul><h2 id="5-后续方向"><a class="markdownIt-Anchor" href="#5-后续方向"></a> 5. 后续方向</h2><p>当前模型中存在的幻觉问题,无疑是后续研究的重点方向, 后续可继续关注此方面的进展。</p><ul><li>《Reflexion: an autonomous agent with dynamic memory and self-reflection》<a href="https://arxiv.org/abs/2303.11366" target="_blank" rel="noopener">3</a> 是一篇在arXiv上发表的论文,提出了一种赋予智能体动态记忆和自我反思能力的方法,以增强其现有的推理追踪和任务特定的动作选择能力。<ul><li>论文基于最近的研究,提出了Reflexion这种方法,使智能体能够通过一个简单而有效的启发式来发现幻觉实例,避免动作序列中的重复,并在某些环境中构建一个内部记忆地图。</li><li>论文评估了智能体在AlfWorld环境中完成决策任务和在HotPotQA环境中完成知识密集型、搜索型问答任务的能力,并观察到了97%和51%的成功率,并对自我反思这一涌现性质进行了讨论。</li></ul></li></ul><h2 id="6-参考资料"><a class="markdownIt-Anchor" href="#6-参考资料"></a> 6. 参考资料</h2><ul><li><a href="https://openai.com/research/gpt-4" target="_blank" rel="noopener">OpenAI GPT-4 官方技术报告</a></li><li>《Sparks of Artificial General Intelligence: Early experiments with GPT-4》</li></ul>]]></content>
<categories>
<category>chatGPT</category>
</categories>
<tags>
<tag>chatGPT</tag>
</tags>
</entry>
<entry>
<title>chatGPT相关大佬的解读</title>
<link href="/chatGPT/chatGPT/chatGPT%E7%9B%B8%E5%85%B3%E5%A4%A7%E4%BD%AC%E7%9A%84%E8%A7%A3%E8%AF%BB/"/>
<url>/chatGPT/chatGPT/chatGPT%E7%9B%B8%E5%85%B3%E5%A4%A7%E4%BD%AC%E7%9A%84%E8%A7%A3%E8%AF%BB/</url>
<content type="html"><![CDATA[<h2 id="chatgpt相关大佬的解读"><a class="markdownIt-Anchor" href="#chatgpt相关大佬的解读"></a> chatGPT相关大佬的解读</h2><blockquote><p>随时更新中</p></blockquote><h3 id="李宏毅"><a class="markdownIt-Anchor" href="#李宏毅"></a> 李宏毅</h3><p><a href="https://www.bilibili.com/video/BV1TA411Y75b/" target="_blank" rel="noopener">【自然语言处理】台大李宏毅 - 来自暗黑大陆的模型 GPT-3_哔哩哔哩_bilibili</a></p><p><a href="https://www.bilibili.com/video/BV1U84y167i3/" target="_blank" rel="noopener">ChatGPT (可能)是怎么炼成的 - GPT社会化的过程 (李宏毅)_哔哩哔哩_bilibili</a></p><p><a href="https://www.bilibili.com/video/BV1V8411p7of/" target="_blank" rel="noopener">算法领域的“大力出奇迹”:ChatGPT!李宏毅教授重磅解读ChatGPT的底层逻辑!感兴趣的同学赶紧收藏学习了!_哔哩哔哩_bilibili</a></p><p><a href="https://www.bilibili.com/video/BV1jA411274Q/" target="_blank" rel="noopener">ChatGPT原理剖析 李宏毅_哔哩哔哩_bilibili</a></p><p><a href="https://www.bilibili.com/video/BV1SL411R7r1/" target="_blank" rel="noopener">【生成式AI】【李宏毅】GPT-4 來了! GPT-4 這次有什麼神奇的能力呢?_哔哩哔哩_bilibili</a></p><h3 id="李沐"><a class="markdownIt-Anchor" href="#李沐"></a> 李沐</h3><p><a href="https://www.bilibili.com/video/BV1AF411b7xQ/" target="_blank" rel="noopener">GPT,GPT-2,GPT-3 论文精读【论文精读】_哔哩哔哩_bilibili</a></p><p><a href="https://www.bilibili.com/video/BV1hd4y187CR/" target="_blank" rel="noopener">InstructGPT 论文精读【论文精读·48】_哔哩哔哩_bilibili</a></p><p><a href="https://www.bilibili.com/video/BV1vM4y1U7b5/" target="_blank" rel="noopener">GPT-4论文精读【论文精读·53】_哔哩哔哩_bilibili</a></p><h3 id="车万翔"><a class="markdownIt-Anchor" href="#车万翔"></a> 车万翔</h3><p><a href="https://ku.baidu-int.com/knowledge/HFVrC7hq1Q/pKzJfZczuc/h2M_JXW8pT/_LcyWnOmmMujAM" target="_blank" rel="noopener">车万翔CHATGPT调研报告</a></p><h3 id="知乎"><a class="markdownIt-Anchor" href="#知乎"></a> 知乎</h3><p><a href="https://zhuanlan.zhihu.com/p/609716668" target="_blank" rel="noopener">GPT / GPT-2 / GPT-3 / InstructGPT 进化之路</a></p><p><a href="https://zhuanlan.zhihu.com/p/350017443" target="_blank" rel="noopener">预训练语言模型之GPT-1,GPT-2和GPT-3</a></p><p><a href="https://zhuanlan.zhihu.com/p/590311003" target="_blank" rel="noopener">ChatGPT/InstructGPT详解</a></p><p><a href="https://zhuanlan.zhihu.com/p/597586623" target="_blank" rel="noopener">通向AGI之路:大型语言模型(LLM)技术精要</a></p>]]></content>
<categories>
<category>chatGPT</category>
</categories>
<tags>
<tag>chatGPT</tag>
</tags>
</entry>
<entry>
<title>如何监测部署服务是否正常运行,同时挂掉后自动重启</title>
<link href="/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E5%A6%82%E4%BD%95%E7%9B%91%E6%B5%8B%E9%83%A8%E7%BD%B2%E6%9C%8D%E5%8A%A1%E6%98%AF%E5%90%A6%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C%EF%BC%8C%E5%90%8C%E6%97%B6%E6%8C%82%E6%8E%89%E5%90%8E%E8%87%AA%E5%8A%A8%E9%87%8D%E5%90%AF/"/>
<url>/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E5%A6%82%E4%BD%95%E7%9B%91%E6%B5%8B%E9%83%A8%E7%BD%B2%E6%9C%8D%E5%8A%A1%E6%98%AF%E5%90%A6%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C%EF%BC%8C%E5%90%8C%E6%97%B6%E6%8C%82%E6%8E%89%E5%90%8E%E8%87%AA%E5%8A%A8%E9%87%8D%E5%90%AF/</url>
<content type="html"><![CDATA[<h1 id="如何监测部署服务是否正常运行同时挂掉后自动重启"><a class="markdownIt-Anchor" href="#如何监测部署服务是否正常运行同时挂掉后自动重启"></a> 如何监测部署服务是否正常运行,同时挂掉后自动重启</h1><h2 id="1需求"><a class="markdownIt-Anchor" href="#1需求"></a> 1.需求</h2><ul><li>在服务器中启动服务,偶尔服务会挂断。通过Python实现脚本进行端口监测,失败后自动重启,同时发送信息到终端接收。</li></ul><h2 id="2实现思路"><a class="markdownIt-Anchor" href="#2实现思路"></a> 2.实现思路:</h2><ul><li>1.通过subprocess 实现端口重启</li><li>2.给接收终端发送信息</li><li>3.通过socket实现端口检测</li><li>4.通过crontab部署定时监测</li></ul><h2 id="3具体实现"><a class="markdownIt-Anchor" href="#3具体实现"></a> 3.具体实现</h2><blockquote><p>前三步骤实现方法</p></blockquote><figure class="highlight livecodeserver"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><code class="hljs livecodeserver">import <span class="hljs-built_in">socket</span><br>import subprocess<br>import requests<br>import json<br>import logging<br><br><span class="hljs-comment"># 日志记录</span><br>logging.basicConfig(<span class="hljs-built_in">format</span>=<span class="hljs-string">'%(asctime)s - %(levelname)s - %(message)s'</span>, level=logging.INFO)<br>logger = logging.getLogger(__name__)<br><br><span class="hljs-comment"># 配置</span><br>host = <span class="hljs-string">'*.*.*.*'</span> <span class="hljs-comment"># 主机名</span><br>compre_port = **** <span class="hljs-comment"># 端口号</span><br>compre_start_serv_path = <span class="hljs-string">'./start.sh'</span> <span class="hljs-comment"># 启动脚本路径</span><br><br><br><span class="hljs-comment"># 信息发送</span><br>def send_msg(<span class="hljs-keyword">text</span>):<br><span class="hljs-comment"># 通过邮件等方式发送</span><br> pass<br><br> logging.info(<span class="hljs-string">"信息发送成功!"</span>)<br><br><br><span class="hljs-comment"># 端口重启</span><br>def serv_restart(port, start_serv_path):<br> subprocess.run([<span class="hljs-string">'sh'</span>, start_serv_path])<br> logging.info(<span class="hljs-string">"重新开启端口:{}"</span>.<span class="hljs-built_in">format</span>(port))<br><br><br><span class="hljs-comment"># 端口检测</span><br>def port_check(<span class="hljs-keyword">text</span>, port, start_serve_path):<br> sock = <span class="hljs-built_in">socket</span>.<span class="hljs-built_in">socket</span>(<span class="hljs-built_in">socket</span>.AF_INET, <span class="hljs-built_in">socket</span>.SOCK_STREAM)<br> <span class="hljs-built_in">result</span> = sock.connect_ex((host, port))<br><br> <span class="hljs-comment"># 端口正常连接</span><br> <span class="hljs-keyword">if</span> <span class="hljs-built_in">result</span> == <span class="hljs-number">0</span>:<br> logging.info(<span class="hljs-string">"Port {} is open on {}"</span>.<span class="hljs-built_in">format</span>(port, host))<br> <span class="hljs-comment"># 端口出现异常,1-发送信息,2-重启端口</span><br> <span class="hljs-keyword">else</span>:<br> logging.info(<span class="hljs-string">"Port {} is close on {}"</span>.<span class="hljs-built_in">format</span>(port, host))<br> <br> <span class="hljs-comment"># 信息发送</span><br> send_msg(<span class="hljs-keyword">text</span>)<br> <span class="hljs-comment"># 重启端口</span><br> serv_restart(port, start_serve_path)<br> sock.<span class="hljs-built_in">close</span>()<br><br><br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:<br> <span class="hljs-comment"># 端口检测</span><br> <span class="hljs-keyword">text</span> = <span class="hljs-string">'综合'</span><br> port_check(<span class="hljs-keyword">text</span>, compre_port, compre_start_serv_path)<br></code></pre></td></tr></table></figure><p>通过crontab 部署定时任务</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs markdown"><span class="hljs-bullet">* </span><span class="hljs-emphasis">* *</span> <span class="hljs-emphasis">* *</span> Command<br></code></pre></td></tr></table></figure><p>具体可以参考:<a href="https://www.runoob.com/w3cnote/linux-crontab-tasks.html" target="_blank" rel="noopener">https://www.runoob.com/w3cnote/linux-crontab-tasks.html</a></p>]]></content>
<categories>
<category>计算机相关</category>
</categories>
<tags>
<tag>Linux</tag>
</tags>
</entry>
<entry>
<title>chatGPT API使用以及参数说明</title>
<link href="/chatGPT/chatGPT/chatGPT-api/"/>
<url>/chatGPT/chatGPT/chatGPT-api/</url>
<content type="html"><![CDATA[<p>OpenAI 官方发布chatGPT(GPT3.5) API 使用指南</p><blockquote><p>该篇文章为 NLPer 和 chatGPT 合作完成。</p></blockquote><p>3月2日,OpenAI放出了真正的ChatGPT API,本次提供的API是真正的模型,就像在说明文档中第一句话:<strong>ChatGPT</strong> is powered by <code>gpt-3.5-turbo</code>, OpenAI’s most advanced language model.</p><blockquote><p>ChatGPT由OpenAI最先进的语言模型<code>gpt-3.5-turbo</code>提供支持。</p></blockquote><p>接下来,通过如下几步骤,一起看看如何使用chatGPT API:</p><ul><li>获取API密钥</li><li>安装依赖项</li><li>创建API调用以及处理响应</li></ul><hr><h2 id="1获取api密钥"><a class="markdownIt-Anchor" href="#1获取api密钥"></a> 1.获取API密钥</h2><p>要使用GPT-3.5 Turbo,需要先获取API密钥。请访问OpenAI的官方网站并注册一个帐户。注册后,可以通过如下截图页面获得API密钥。</p><p>OpenAI官方网站:<a href="https://openai.com/" target="_blank" rel="noopener">https://openai.com/</a></p><blockquote><p>如何注册openAI账户,网上很多资料,在此不再赘述。</p></blockquote><p>步骤一:</p><p><img src="/Users/zhangxuewen03/md_images/image-20230302164019362.png" srcset="/img/loading.gif" lazyload alt="image-20230302164019362"></p><p>步骤二:</p><p><img src="/Users/zhangxuewen03/md_images/image-20230302164130833.png" srcset="/img/loading.gif" lazyload alt="image-20230302164130833"></p><blockquote><p>创建完成后,secret key 一定不要泄露,要不自己账户的钱可能会被别人使用。</p></blockquote><h2 id="2安装依赖项"><a class="markdownIt-Anchor" href="#2安装依赖项"></a> 2.安装依赖项</h2><p>要使用GPT-3.5 Turbo,需要安装适当的依赖项。如果使用Python,可以通过pip安装openai包。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">pip3 install openai<br></code></pre></td></tr></table></figure><h2 id="3创建api调用以及处理响应"><a class="markdownIt-Anchor" href="#3创建api调用以及处理响应"></a> 3.创建API调用以及处理响应</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># 导入openai库</span><br><span class="hljs-keyword">import</span> openai<br> <br> <br><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">openai_reply</span><span class="hljs-params">(content, apikey)</span>:</span><br> <span class="hljs-comment"># 设置API密钥</span><br> openai.api_key = apikey<br><br> <span class="hljs-comment"># 构造请求 -- 参数具体说明后面解释</span><br> response = openai.ChatCompletion.create(<br> model=<span class="hljs-string">"gpt-3.5-turbo-0301"</span>, <span class="hljs-comment"># gpt-3.5-turbo-0301</span><br> messages=[<br> {<span class="hljs-string">"role"</span>: <span class="hljs-string">"user"</span>, <span class="hljs-string">"content"</span>: content}<br> ],<br> temperature=<span class="hljs-number">0.5</span>,<br> max_tokens=<span class="hljs-number">1024</span>,<br> top_p=<span class="hljs-number">1</span>,<br> frequency_penalty=<span class="hljs-number">0</span>,<br> presence_penalty=<span class="hljs-number">0</span>,<br> )<br><br> <span class="hljs-keyword">return</span> response.choices[<span class="hljs-number">0</span>].message.content<br> <br> <br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">'__main__'</span>:<br> content = <span class="hljs-string">'为一个{年龄}岁的人写一个800字的童话故事,这个故事要有一定的寓意。'</span><br> ans = openai_reply(content, <span class="hljs-string">'你的secret key'</span>)<br> print(ans)<br></code></pre></td></tr></table></figure><ul><li>通过以上方式,就可以实现chatGPT API 的调用体验。</li></ul><p><img src="/Users/zhangxuewen03/md_images/image-20230302180039910.png" srcset="/img/loading.gif" lazyload alt="image-20230302180039910"></p><hr><h2 id="4其他说明"><a class="markdownIt-Anchor" href="#4其他说明"></a> 4.其他说明</h2><h3 id="41-调用参数解释"><a class="markdownIt-Anchor" href="#41-调用参数解释"></a> 4.1 调用参数解释</h3><blockquote><p>没有注明是 [必须] 的,为可选参数</p></blockquote><ul><li><p>model[必须]:要使用的模型ID。目前仅支持gpt-3.5-turbo和 gpt-3.5-turbo-0301;</p><ul><li>gpt-3.5-turbo-0301模型有效期到6月1日,而gpt-3.5-turbo会持续更新。</li></ul></li><li><p>messages[必须]:以聊天格式生成聊天完成的消息。</p><ul><li><p>messages字段组成部分包括角色role和content问题两个部分组成,如下所示:</p></li><li><pre class="highlight"><code class="python"> messages=[ {<span class="hljs-string">"role"</span>: <span class="hljs-string">"system"</span>, <span class="hljs-string">"content"</span>: <span class="hljs-string">"You are a helpful assistant."</span>}, {<span class="hljs-string">"role"</span>: <span class="hljs-string">"user"</span>, <span class="hljs-string">"content"</span>: <span class="hljs-string">"Who won the world series in 2020?"</span>}, {<span class="hljs-string">"role"</span>: <span class="hljs-string">"assistant"</span>, <span class="hljs-string">"content"</span>: <span class="hljs-string">"The Los Angeles Dodgers won the World Series in 2020."</span>}, {<span class="hljs-string">"role"</span>: <span class="hljs-string">"user"</span>, <span class="hljs-string">"content"</span>: <span class="hljs-string">"Where was it played?"</span>} ]</code></pre></li><li><p>在gpt-3.5-turbo模型中,角色role包含system系统、assistant助手和用户user三种类型。</p></li><li><p>System角色相当于告诉ChatGPT具体以何种角色回答问题,需要在content中指明具体的角色和问题内容。而gpt-3.5-turbo-0301主要区别在于更加关注问题内容,而不会特别关注具体的角色部分。</p></li><li><p>assistant助手和用户user则相当于已经指明了角色,content直接写入关注的问题即可。</p></li></ul></li><li><p>temperature:使用什么采样温度,介于 0 和 2 之间。较高的值(如 0.8)将使输出更加随机,而较低的值(如 0.2)将使输出更加集中和确定。</p></li><li><p>top_p:一种替代 temperature 采样的方法,称为核采样(nucleus sampling),模型考虑具有 top_p 概率质量标记的结果。所以 0.1 意味着只考虑构成前 10% 概率质量的标记。</p><ul><li>官方建议改变这个或<code>temperature</code>参数,不需要两者同时改变。</li></ul></li><li><p>n:为每个输入消息生成多少个聊天完成选项。</p><ul><li>比如n=3,就会生成3个聊天应答结果。</li></ul></li><li><p>stream:是否使用控制流的方式输出,默认为false</p><ul><li>如果stream取值为False,返回全部文字结果,可通过response[“choices”][0][“text”]进行读取。但是,字数越多,等待返回时间越长。</li><li>如果steam取值为True时,那么返回结果是一个Python generator,需要通过迭代获取结果,大约每秒钟4个字。</li></ul></li><li><p>stop:达到4个序列时,API 停止生成更多的 token.</p></li><li><p>max_tokens:最大生成token数</p><ul><li>生成的答案允许的最大 token 数。默认情况下,模型可以返回的标记数为(4096 - prompt token)。</li></ul></li><li><p>presence_penalty:-2.0 和 2.0 之间的数字。正值会根据到目前为止是否出现在文本中来惩罚新 token,从而增加模型谈论新主题的可能性。</p></li><li><p>frequency_penalty:-2.0 和 2.0 之间的数字。正值会根据新标记在文本中的现有频率对其进行惩罚,从而降低模型逐字重复同一行的可能性。</p></li><li><p>logit_bias:偏差设置。</p></li><li><p>user:用户的唯一标识符,可以帮助 OpenAI 监控和检测滥用行为。</p></li></ul><blockquote><p>参考官方文档:<a href="https://platform.openai.com/docs/api-reference/chat/create" target="_blank" rel="noopener">https://platform.openai.com/docs/api-reference/chat/create</a></p></blockquote><h3 id="42-费用说明"><a class="markdownIt-Anchor" href="#42-费用说明"></a> 4.2 费用说明</h3><p>调用费用为0.002美元/1000tokens。</p><p>注意:</p><ul><li><p>1.这个字数包括问题和返回结果字数。</p></li><li><p>2.token解释:</p><ul><li><p>在英语中,token 可以短至一个字符,也可以长至一个单词(例如,<code>a</code>或<code>apple</code>),在某些语言中,token 甚至可以短于一个字符,甚至长于一个单词。</p><p>例如,字符串<code>“ChatGPT is great!”</code>被编码为六个标记:<code>[“Chat”, “G”, “PT”, “ is”, “ great”, “!”]</code>.</p></li></ul></li></ul><h3 id="43-是否可以进行微调gpt-35-turbo"><a class="markdownIt-Anchor" href="#43-是否可以进行微调gpt-35-turbo"></a> 4.3 是否可以进行微调<code>gpt-3.5-turbo</code>?</h3><p>不可以。自 2023 年 3 月 1 日起,您只能微调基础 GPT-3 模型。</p><hr>]]></content>
<categories>
<category>chatGPT</category>
</categories>
<tags>
<tag>chatGPT</tag>
</tags>
</entry>
<entry>
<title>GPT系列论文&报告</title>
<link href="/chatGPT/chatGPT/GPT%E7%B3%BB%E5%88%97%E6%96%87%E7%AB%A0/"/>
<url>/chatGPT/chatGPT/GPT%E7%B3%BB%E5%88%97%E6%96%87%E7%AB%A0/</url>
<content type="html"><![CDATA[<h1 id="gpt系列论文报告"><a class="markdownIt-Anchor" href="#gpt系列论文报告"></a> GPT系列论文&报告</h1><blockquote><p>随时更新中</p></blockquote><p>英文全称:Generative Pre-trained Transformer</p><p>演进历程:</p><ul><li>GPT-1(2018-06):<a href="https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf" target="_blank" rel="noopener">Improving Language Understanding by Generative Pre-training</a></li><li>GPT-2(2019-02):<a href="https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learners.pdf" target="_blank" rel="noopener">Language Models are unsupervised multitask learners</a></li><li>GPT-3(2020-05):<a href="https://arxiv.org/pdf/2005.14165.pdf" target="_blank" rel="noopener">Language models are few shot learners</a></li></ul><blockquote><p>GPT主要是基于 Google 2017-06发出的《Attention is All Your Need》文章中 Transformer 的 decoder 架构,2018-06 提出了第一版GPT模型,2018-10 Google 提出了Bert 模型。</p></blockquote><p>GPT可以实现功能:</p><ul><li>可以实现文本补全、代码补全、翻译、自然语言到计算机语言的转换、聊天等</li><li>功能非常多,具体可以参考官网:<a href="https://platform.openai.com/examples" target="_blank" rel="noopener">https://platform.openai.com/examples</a></li></ul><h2 id="原论文报告"><a class="markdownIt-Anchor" href="#原论文报告"></a> 原论文&报告</h2><h3 id="gpt-1"><a class="markdownIt-Anchor" href="#gpt-1"></a> GPT-1</h3><p>论文链接:<a href="https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/language_understanding_paper.pdf" target="_blank" rel="noopener">GPT-1</a></p><p>在GPT-1之前(和ELMo同一年),传统的NLP模型往往使用大量的数据对有监督的模型进行任务相关的模型训练,但是这种有监督学习的任务存在两个缺点:</p><ol><li>需要大量的标注数据,而高质量的标注数据往往很难获得,一方面需要很多专业的技术人员做标注,另一方面数据的获取非常昂贵。</li><li>根据一个任务训练的模型很难泛化到其它任务中,这个模型只能叫做“领域专家”而不是真正的理解了NLP。</li></ol><p>GPT-1的思想是先通过在无标签的数据上学习一个生成式的语言模型,然后再根据特定的任务进行微调,处理的有监督任务包括:</p><ol><li>自然语言推理</li><li>问答和常识推理</li><li>语义相似度</li><li>分类</li></ol><p>总结来说,GPT-1就是无监督训练+有监督微调。</p><h3 id="gpt-2"><a class="markdownIt-Anchor" href="#gpt-2"></a> GPT-2</h3><p>论文链接:<a href="https://life-extension.github.io/2020/05/27/GPT%E6%8A%80%E6%9C%AF%E5%88%9D%E6%8E%A2/language-models.pdf" target="_blank" rel="noopener">GPT-2</a></p><p>GPT-2的目标旨在训练一个泛化能力更强的词向量模型,它并没有对GPT-1的网络进行过多的结构的创新与设计,只是使用了更多的网络参数和更大的数据集。GPT-2的学习目标是<strong>使用无监督的预训练模型做有监督的任务</strong>。当一个语言模型足够大时,它就足矣覆盖所有的有监督任务,即所有的有监督学习都是无监督语言模型的一个子集。</p><p>GPT-2的最大贡献是验证了通过海量数据和大量参数训练出来的词向量模型有迁移到其它类别任务中而不需要额外的训练。但是很多实验也表明,GPT-2的无监督学习的能力还有很大的提升空间。</p><h3 id="gpt-3"><a class="markdownIt-Anchor" href="#gpt-3"></a> GPT-3</h3><p>论文链接:<a href="https://arxiv.org/pdf/2005.14165.pdf" target="_blank" rel="noopener">GPT-3</a></p><p>GPT3的参数量达到了海量级别,1750亿的参数量,45TB的训练数据使得它成为2020年最强大的语言模型。</p><p>In-context learning是这篇论文中介绍的一个重要概念,它在GPT3中类似于内循环,而针对不同任务的整体优化则是外循环。</p><p>在大量的语言模型数据集中,GPT-3超过了绝大多数的zero-shot或者few-shot的state-of-the-art方法。另外GPT-3在很多复杂的NLP任务中也超过了fine-tune之后的state-of-the-art方法,例如闭卷问答,模式解析,机器翻译等。除了这些传统的NLP任务,GPT-3在一些其他的领域也取得了非常震惊的效果,例如进行数学加法,文章生成,编写代码等。</p><h3 id="gpt-35"><a class="markdownIt-Anchor" href="#gpt-35"></a> GPT-3.5</h3><p>论文链接:<a href="https://arxiv.org/pdf/2203.02155.pdf" target="_blank" rel="noopener">GPT-3.5</a></p><p>GPT3.5,也就是InstructGPT/ChatGPT,他们采用了<strong>GPT-3</strong>的网络结构,通过<strong>指示学习</strong>构建训练样本来训练一个反应预测内容效果的奖励模型(RM),最后通过这个奖励模型的打分来指导强化学习模型的训练。这个训练过程主要分为三步:</p><ol><li>根据采集的SFT数据集对GPT-3进行有监督的微调(Supervised FineTune,SFT);</li><li>收集人工标注的对比数据,训练奖励模型(Reword Model,RM);</li><li>使用RM作为强化学习的优化目标,利用PPO算法微调SFT模型。</li></ol><p><img src="https://tc-sherwin.oss-cn-beijing.aliyuncs.com/img/image-20230523224012170.png" srcset="/img/loading.gif" lazyload alt=""></p><p>GPT3.5引入了人工标注之后,让模型的“价值观”和的正确程度和人类行为模式的“真实性”上都大幅的提升。</p><h3 id="gpt-4"><a class="markdownIt-Anchor" href="#gpt-4"></a> GPT-4</h3><p>技术报告:<a href="https://arxiv.org/pdf/2303.08774.pdf" target="_blank" rel="noopener">GPT-4</a></p><p>结论:</p><ol><li>GPT-4朝着AGI迈出了坚实一步,但离AGI仍然遥远。</li><li>GPT-4的智能模式与人类智能具有非常大的差异。</li><li>GPT-4无法创造新知识</li><li>GPT-4能够从纯文本中产生视觉概念</li><li>GPT-4在代码理解上的能力达到前所未有的高度</li><li>在数学计算能力上远远落后于其他能力</li><li>GPT-4仍然缺乏常识</li><li>GPT-4能够使用工具在外部世界进行交互,但仍然存在一些典型问题</li><li>GPT-4在理解意图、情绪方面具有显著进步</li><li>由于GPT-4采用的自回归结构,导致它在规划能力上、working memory上明显不足。</li><li>GPT-4导致的社会问题主要包括错误答案、被错误使用、偏见和进一步加剧不平等。</li></ol>]]></content>
<categories>
<category>chatGPT</category>
</categories>
<tags>
<tag>chatGPT</tag>
</tags>
</entry>
<entry>
<title>推荐系统通俗介绍</title>
<link href="/%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F/%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F/%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F%E9%80%9A%E4%BF%97%E4%BB%8B%E7%BB%8D/"/>
<url>/%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F/%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F/%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F%E9%80%9A%E4%BF%97%E4%BB%8B%E7%BB%8D/</url>
<content type="html"><![CDATA[<h1 id="推荐系统通俗介绍"><a class="markdownIt-Anchor" href="#推荐系统通俗介绍"></a> 推荐系统通俗介绍</h1><blockquote><p>资料整理,来源于北大刘宏志教授讲座内容。</p></blockquote><p>在介绍推荐系统前,我们先想一个问题,为什么要有推荐系统?在推荐系统没有出现前,难道我们就不能更好的生活?</p><p>其实这方面主要归因于,互联网技术的迅猛发展,带来信息爆炸,进而我们接触到的信息都是超载的。</p><p>我们将转变接受信息的理念:”多即是少、少即是多“。</p><blockquote><p>试想,我们去逛超市,面对琳琅满目的同类商品,是不是也会犯”选择困难症“。</p></blockquote><h2 id="1推荐系统概念"><a class="markdownIt-Anchor" href="#1推荐系统概念"></a> 1.推荐系统概念</h2><p>关于推荐系统概念,我们可以认为:</p><ul><li>推荐系统是<strong>一种主动的信息过滤系统</strong>;即将信息过滤的过程由”<strong>用户主动搜索</strong>“转变为”<strong>系统主动推送</strong>“。</li></ul><p>什么样的系统需要用户主动搜索呢?我们常见的就是不同的搜索引擎,如:百度、Google等。</p><p>用户主动搜索建立在两个前提:</p><ul><li>用户知道自己要什么</li><li>用户知道自己该如何描述</li></ul><p>而推荐是挖掘并且满足用户的潜在需求,如:今日头条、Amazon等。</p><p>同时,推荐系统还是一种双边匹配系统,把恰当的商品(信息)推荐给人</p><ul><li>帮助用户发现其所喜好的或需要的小众、非主流商品;</li><li>帮助商户将其商品展现在对它们感兴趣的用户面前。</li></ul><hr><p>这一切正如《长尾》的作者 Chris Anderson 所言:</p><ul><li>We are leaving the age of information and entering the age of recommendation.</li></ul><h2 id="2推荐系统发展历史"><a class="markdownIt-Anchor" href="#2推荐系统发展历史"></a> 2.推荐系统发展历史</h2><p>如果我们想要遇见将来,适当的途径是研究这门学科的历史和现状。</p><p>信息过载、推荐系统,这些词语并不是最近才被人提及。</p><p>推荐系统的整个发展历程又是怎么变化的呢,请看下面梳理内容。</p><p><img src="https://tva1.sinaimg.cn/large/008vxvgGly1h89d56a1tcj31m10phagl.jpg" srcset="/img/loading.gif" lazyload alt="历史1"></p><p><img src="https://tva1.sinaimg.cn/large/008vxvgGly1h89d5chhxbj31l90pcdlu.jpg" srcset="/img/loading.gif" lazyload alt="2"></p><blockquote><p>参考资料可以点击下原文查看</p><p>参考自:<a href="https://cloud.tencent.com/developer/article/1652169" target="_blank" rel="noopener">https://cloud.tencent.com/developer/article/1652169</a></p></blockquote><h2 id="3个性化推荐系统框架"><a class="markdownIt-Anchor" href="#3个性化推荐系统框架"></a> 3.个性化推荐系统框架</h2><p><img src="https://tva1.sinaimg.cn/large/008vxvgGly1h89deu6b6gj31ai0meadg.jpg" srcset="/img/loading.gif" lazyload alt="image-20221118164125585"></p><hr><p>基于公式的描述:</p><ul><li><p>映射函数 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>f</mi><mo>:</mo><mi>U</mi><mo>×</mo><mi>I</mi><mo>→</mo><mi>R</mi></mrow><annotation encoding="application/x-tex">f:U×I→R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.8888799999999999em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.10764em">f</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">:</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.76666em;vertical-align:-.08333em"></span><span class="mord mathdefault" style="margin-right:.10903em">U</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">×</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.68333em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.07847em">I</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">→</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.68333em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.00773em">R</span></span></span></span></p></li><li><p>输入:</p><ul><li>用户画像(U):评分、偏好、人口统计学资料、上下文等</li><li>项目画像(I):项目描述(属性)、内容等</li></ul></li><li><p>计算:兴趣度或相关度(R),用于排序</p></li><li><p>输出:针对每个用户,给出项目排序列表</p></li></ul><hr><p>用户画像,即对用户的特点和兴趣进行建模</p><ul><li><p>从用户相关的各种数据中挖掘或抽取出用户在不同属性上的标签</p></li><li><p>例如:年龄、性别、职业、婚姻状态、兴趣、未来可能行为等</p></li></ul><p>项目画像,即对项目的特点进行建模</p><ul><li><p>从项目相关的各种数据中挖掘和抽取出项目在不同属性上的标签</p></li><li><p>实现对项目(例如商品、服务等)的精准的定位</p></li></ul><h2 id="4部分案例分"><a class="markdownIt-Anchor" href="#4部分案例分"></a> 4.部分案例分</h2><h3 id="41-搜狐视频个性化推荐架构"><a class="markdownIt-Anchor" href="#41-搜狐视频个性化推荐架构"></a> 4.1 搜狐视频个性化推荐架构</h3><p><img src="https://tva1.sinaimg.cn/large/008vxvgGly1h89dvu8ks0j317y0o2dkj.jpg" srcset="/img/loading.gif" lazyload alt="image-20221118165746275"></p><h3 id="42-今日头条推荐系统架构"><a class="markdownIt-Anchor" href="#42-今日头条推荐系统架构"></a> 4.2 <strong>今日头条推荐系统架构</strong></h3><p><img src="https://tva1.sinaimg.cn/large/008vxvgGly1h89dtiwtqqj30hs08lgly.jpg" srcset="/img/loading.gif" lazyload alt="今日头条推荐系统架构设计实践"></p><p><img src="https://tva1.sinaimg.cn/large/008vxvgGly1h89dtq64cnj30hs06ujrm.jpg" srcset="/img/loading.gif" lazyload alt="今日头条推荐系统架构设计实践"></p><h3 id="43-netflix推荐系统架构图"><a class="markdownIt-Anchor" href="#43-netflix推荐系统架构图"></a> 4.3 Netflix推荐系统架构图</h3><p><img src="https://pic1.zhimg.com/v2-5977ad4f475f160d23943cdb0bfb9d2c_b.jpg" srcset="/img/loading.gif" lazyload alt="回顾经典,Netflix的推荐系统架构- 知乎"></p><h2 id="5-视频推荐系统流程设计"><a class="markdownIt-Anchor" href="#5-视频推荐系统流程设计"></a> 5. 视频推荐系统流程设计</h2><p>构建用户画像:</p><ul><li><p>输入数据:用户注册数据、行为日志、系统展示日志 等</p></li><li><p>事实标签:性别、年龄、地域、人群(学生、上班族等)等</p></li><li><p>模型标签:主题偏好、兴趣标签(明星、导演、风格等)等</p></li><li><p>预测标签:用户活跃度、用户价值 等</p></li></ul><p>视频(项目)画像:</p><ul><li><p>输入数据:视频描述、视频内容、相关用户信息 等</p></li><li><p>事实标签:主演、导演、出品人、主题 等</p></li><li><p>模型与预测标签:评分、热度、关键词 、适合人群等</p></li></ul><p><img src="https://tva1.sinaimg.cn/large/008vxvgGly1h89dq9tvuxj31as0i6q7t.jpg" srcset="/img/loading.gif" lazyload alt="image-20221118165224269"></p><p>最后目标:</p><img src="https://tva1.sinaimg.cn/large/008vxvgGly1h89dqp762kj30ty0bkwgn.jpg" srcset="/img/loading.gif" lazyload alt="image-20221118165249780" style="zoom:50%"><h2 id="总结"><a class="markdownIt-Anchor" href="#总结"></a> 总结</h2><p>本文主要对推荐系统做了基本介绍,从推荐系统为什么会出现,然后讲解了推荐系统基本概念,以及推荐和搜索的区别;梳理了推荐系统的发展历史,推荐系统主要架构,部分推荐系统案例;最后自己设计了一个视频推荐系统整体流程。</p>]]></content>
<categories>
<category>推荐系统</category>
</categories>
<tags>
<tag>AI</tag>
<tag>RS</tag>
</tags>
</entry>
<entry>
<title>《人世间》小说已阅</title>
<link href="/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/%E3%80%8A%E4%BA%BA%E4%B8%96%E9%97%B4%E3%80%8B%E5%B0%8F%E8%AF%B4%E5%B7%B2%E9%98%85/"/>
<url>/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/%E3%80%8A%E4%BA%BA%E4%B8%96%E9%97%B4%E3%80%8B%E5%B0%8F%E8%AF%B4%E5%B7%B2%E9%98%85/</url>
<content type="html"><![CDATA[<p>国庆期间,因为疫情,同时北京马上二十大召开,出京不便,于是在放假前几天买了这部小说。不辱使命,几天时间把上、中、下三部都翻完。</p><p>我发现,对于这种描写近现代几代人生活的小说,我有一种莫名的的痴迷,比如之前看过的《平凡的世界》、《白鹿原》、《大江东去》。</p><p>看完之后,不得不感叹作者描写人物的功力,那么多人物,每个都刻画的惟妙惟肖,从周志刚、周秉义、周蓉、周秉昆等等,都会在读者的脑中建立起很好的模型。周家三代人,以及围绕三代人展开的亲戚朋友,一个很大的网,网上每个节点的人物都会在合理的位置出现,塑造着自己的形象。</p><p>整本书从文化大革命写起,首先给人描写了文化大革命下,远离北京的东北地区是一种什么样的状态,受到文化大革命影响的人们,又是如何应对;然后是文化大革命结束,恢复高考,周家三兄妹,分成两条支线,分别发展;等到他们毕业分成三条支线,再谱写着自己的故事:仕途线、高校线、底层线。梁老在写做中,一定更多的偏向了底层线,围绕周秉昆又做了展开,写了在酱油厂的朋友、写了光字片的邻居。</p><p>除了这种主要一代人物随着时间的划分,我理解应该还有一种对比,周家三代人的对比,第一代:周志刚;第二代:周秉昆(他是全书的主角);第三代:周聪。这三代人,应该走出了一个抛物线,从第一代建筑工人到第二代多个领域开花,再到第三代的发展。在此处一定要说为什么第二代可以走向最辉煌的局面,虽然周志刚夫妇都是农民出身,但是他们的身上有凛然正气,在教育子女中没有只要面子,不要“里子”;同时他们的教育没有人云亦云,书中描写印象比较深刻的地方,文化大革命的时候,她妈给他们放风,他们在里屋一起讨论当时不允许看的国外名著,借此,造就了周秉义和周蓉更完美的人格,也是这个环境,最后他的妻子、她的丈夫就是一起讨论的伙伴。周秉昆没有发展的非常好,与在家中是最小的孩子,没有去思考更多、更深层次的内容有一定关系吧。不过他的一大特点是爱结交更多朋友,比如在酱油厂的时候,结交的那些朋友,在书中也是一条线,通过每年正月他们是否聚在一起,来说明当时所处的背景,或者彼此之间的友谊。总体而言,第二代人发展的相当棒,至于周家第三代,我理解,如果没有这么突出的第二代,他们断然不会发展的这么好,这应该与他们没有更加强调子女教育有关系吧 ,或者说,在德方面的强调更少一些。</p><p>书中的一些内容,可以看到对当今社会的批判,对一些不公现象的揭露,不过大方向依旧是:好人好报。</p><p>当然这是所有社会的价值观。</p><p>但是当你看到书中描写人物去世的时候,还是会感到唏嘘,比如周志刚的因病去世、比如周楠的见义勇为去世,等等都还是让人唏嘘,最初看到周楠去世时,觉得作者的写法有些奇怪,不像之前看的小说,比如:《平凡的世界》田晓霞去世,写完后,立即写带给少平的打击,然后把一点描述的特别深入。但是《人世间》不是,他说完这个结果后,立即就转到另一个事清的描述,后来才会写郑娟是多么多么悲伤、周秉昆是多么多么悲伤,两种不同的写法吧。</p><p>今天感想先到此处,其他留作以后再去闲谈。</p><p>已阅,是我喜欢的菜。</p><blockquote><p>于 2022-10-09 19:40:25</p></blockquote>]]></content>
<categories>
<category>程序人生</category>
</categories>
<tags>
<tag>随感</tag>
</tags>
</entry>
<entry>
<title>DeBERTa系列模型介绍</title>
<link href="/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/NLP/DeBERTa%E6%A8%A1%E5%9E%8B%E4%BB%8B%E7%BB%8D/"/>
<url>/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/NLP/DeBERTa%E6%A8%A1%E5%9E%8B%E4%BB%8B%E7%BB%8D/</url>
<content type="html"><![CDATA[<h1 id="deberta系列模型介绍"><a class="markdownIt-Anchor" href="#deberta系列模型介绍"></a> DeBERTa系列模型介绍</h1><blockquote><p>本文是BERT相关系列模型第四篇内容,前三篇见该分类下内容。</p></blockquote><h2 id="1基本介绍"><a class="markdownIt-Anchor" href="#1基本介绍"></a> 1.基本介绍</h2><p>DeBERTa(Decoding-enhanced BERT with disentangled attention)模型是微软在2021年提出的,到现在其实已经迭代了三个版本,第一版发布的时候在SuperGLUE[1]排行榜上就已经获得了超越人类的水平。目前,一些比较有挑战的NLP任务,甚至是NLG任务都会用DeBERTa模型当成预训练模型,进一步微调。</p><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h6bo55lipdj210a0d0wh9.jpg" srcset="/img/loading.gif" lazyload alt="image-20220919094308225"></p><blockquote><p>图1:DeBERTA V1 模型结构</p><p>来源:<a href="https://www.microsoft.com/en-us/research/blog/microsoft-deberta-surpasses-human-performance-on-the-superglue-benchmark/?lang=fr_ca" target="_blank" rel="noopener">https://www.microsoft.com/en-us/research/blog/microsoft-deberta-surpasses-human-performance-on-the-superglue-benchmark/?lang=fr_ca</a></p></blockquote><p><strong>DeBERTa 模型使用了两种新技术改进了 BERT 和 RoBERTa 模型,同时还引入了一种新的微调方法以提高模型的泛化能力。</strong></p><p>两种新技术的改进:</p><ul><li><strong>注意力解耦机制</strong>:图1右侧黄色部分</li><li>**增强的掩码解码器 :**图1左侧Enhanced Mask Decoder部分(V3版本中,用其他方法替换)</li></ul><p>新的微调方法:<strong>虚拟对抗训练方法</strong>。</p><p>结果表明,这些技术显著提高了模型预训练的效率以及自然语言理解(NLU)和自然语言生成(NLG)下游任务的性能。</p><p>与 Large-RoBERTa 相比,基于一半训练数据训练的 DeBERTa 模型在很多 NLP 任务中始终表现得更好,MNLI 提高了+0.9%(90.2%–>91.1%),SQuAD v2.0提高了+2.3%(88.4%–>90.7%),RACE提高了+3.6%(83.2%–>86.8%)。</p><p>同时,通过训练由48个Transformer层和15亿参数组成的Large-DeBERTa模型。其性能得到显著提升,单个 DeBERTa 模型在平均得分方面首次超过了 SuperGLUE 基准测试上的表现,同时集成的 DeBERTa 模型目前位居榜首。 截至 2021 年 1 月 6 日,SuperGLUE 排行榜已经超过了人类基线(90.3 VS 89.8)。</p><h2 id="2deberta架构"><a class="markdownIt-Anchor" href="#2deberta架构"></a> 2.DeBERTa架构</h2><h3 id="21-deberta-v1"><a class="markdownIt-Anchor" href="#21-deberta-v1"></a> 2.1 DeBERTa V1</h3><h4 id="211-结构图"><a class="markdownIt-Anchor" href="#211-结构图"></a> 2.1.1 结构图</h4><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h6bo55lipdj210a0d0wh9.jpg" srcset="/img/loading.gif" lazyload alt="image-20220919094308225"></p><blockquote><p>图1:DeBERTa V1模型结构</p></blockquote><h4 id="211-优化点解释"><a class="markdownIt-Anchor" href="#211-优化点解释"></a> 2.1.1 优化点解释</h4><h4 id="a-注意力解耦disentangled-attention"><a class="markdownIt-Anchor" href="#a-注意力解耦disentangled-attention"></a> a) 注意力解耦(Disentangled attention)</h4><ul><li>在BERT 中,输入层的每个单词都使用一个向量来表示,该向量是其单词(内容)嵌入和位置嵌入的总和。</li></ul><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h6bp3pq0mxj21dw0f4gp1.jpg" srcset="/img/loading.gif" lazyload alt="image-20220919101623152"></p><blockquote><p>图2:BERT输入表示. 输入嵌入是token embeddings, segmentation embeddings 和position embeddings 之和。</p></blockquote><ul><li>而 DeBERTa 中的每个单词使用两个对其内容和位置分别进行编码的向量来表示,并且注意力单词之间的权重分别使用基于它们的内容和相对位置的解码矩阵来计算。</li><li>这么做的原因是,经观察发现,单词对的注意力权重不仅取决于它们的内容,还取决于它们的相对位置。 例如,“deep”和“learning”这两个词相邻出现时,它们之间的依赖性比它们出现在不同句子中时要强得多。</li><li>对于序列中位置 i 处的 token,微软使用了两个向量, {H<sub>i</sub>} 和{ P<sub>i|j</sub> }表示它,它们分别表示其内容和与位置 j 处的token的相对位置。 token i 和 j 之间的交叉注意力得分的计算可以分解为四个部分:</li></ul><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h6bp0xrbtuj219o05aq3c.jpg" srcset="/img/loading.gif" lazyload alt="image-20220919101342671"></p><ul><li>也就是说,<strong>一个单词对的注意力权重可以使用其内容和位置的解耦矩阵计算为四个注意力(内容到内容,内容到位置,位置到内容和位置到位置)的得分总和。</strong></li><li>现有的相对位置编码方法在计算注意力权重时使用单独的嵌入矩阵来计算相对位置偏差。 这等效于仅使用上等式中的“内容到内容”和“内容到位置”来计算注意力权重。微软认为位置到内容也很重要,因为单词对的注意力权重不仅取决于它们的内容,还会和相对位置有关。根据它们的相对位置,只能使用内容到位置和位置到内容进行完全建模。 <strong>由于微软使用相对位置嵌入,因此位置到位置项不会提供太多附加信息,因此在实现中将其从上等式中删除。</strong></li></ul><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h6bpc5unlcj219o05agm3.jpg" srcset="/img/loading.gif" lazyload alt="image-20220919102430038"></p><h4 id="b-增强的掩码解码器"><a class="markdownIt-Anchor" href="#b-增强的掩码解码器"></a> b) 增强的掩码解码器</h4><p>DeBERTa和BERT模型一样,也是使用MLM进行预训练的,在该模型中,模型被训练为使用 mask token 周围的单词来预测mask词应该是什么。 DeBERTa将上下文的内容和位置信息用于MLM。 <strong>解耦注意力机制已经考虑了上下文词的内容和相对位置,但没有考虑这些词的绝对位置</strong>,这在很多情况下对于预测至关重要。</p><p>如:给定一个句子“a new store opened beside the new mall”,并用“store”和“mall”两个词 mask 以进行预测。 仅使用局部上下文(即相对位置和周围的单词)不足以使模型在此句子中区分store和mall,<strong>因为两者都以相同的相对位置在new单词之后。 为了解决这个限制,模型需要考虑绝对位置,作为相对位置的补充信息。</strong> 例如,句子的主题是“store”而不是“mall”。 这些语法上的细微差别在很大程度上取决于单词在句子中的绝对位置。</p><p><strong>有两种合并绝对位置的方法。 BERT模型在输入层中合并了绝对位置。 在DeBERTa中,微软在所有Transformer层之后将它们合并</strong>,然后在softmax层之前进行 mask token 预测,如图3 所示。这样,DeBERTa捕获了所有Transformer层中的相对位置,同时解码被mask的单词时将绝对位置用作补充信息 。 此即为 DeBERTa 增强型掩码解码器(EMD)。</p><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h6bqdhq901j21960l0abi.jpg" srcset="/img/loading.gif" lazyload alt="image-20220919110022829"></p><blockquote><p>图3: 解码器比较</p><p>来源:<a href="https://arxiv.org/pdf/2006.03654.pdf" target="_blank" rel="noopener">https://arxiv.org/pdf/2006.03654.pdf</a></p></blockquote><p>EMD的结构如图2b 所示。 EMD有两个输入(即 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>I</mi><mo separator="true">,</mo><mi>H</mi></mrow><annotation encoding="application/x-tex">I,H</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.8777699999999999em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.07847em">I</span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord mathdefault" style="margin-right:.08125em">H</span></span></span></span>)。 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>H</mi></mrow><annotation encoding="application/x-tex">H</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.68333em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.08125em">H</span></span></span></span> 表示来自先前的transformer层的隐藏状态,并且 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>I</mi></mrow><annotation encoding="application/x-tex">I</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.68333em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.07847em">I</span></span></span></span> 可以是用于解码的任何必要信息,例如,绝对位置嵌入或从先前的EMD层输出。 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault">n</span></span></span></span> 表示 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault">n</span></span></span></span> 个EMD堆叠层,其中每个EMD层的输出将是下一个EMD层的输入<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>I</mi></mrow><annotation encoding="application/x-tex">I</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.68333em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.07847em">I</span></span></span></span>,最后一个EMD层的输出将直接输出到语言模型头。 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault">n</span></span></span></span> 层可以共享相同的权重。 在实验中,微软设定<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi><mo>=</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">n=2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.64444em;vertical-align:0"></span><span class="mord">2</span></span></span></span> ,即2层共享相同的权重,以减少参数的数量,并使用绝对位置嵌入作为第一个EMD层的<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>I</mi></mrow><annotation encoding="application/x-tex">I</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.68333em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.07847em">I</span></span></span></span>。 当 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>I</mi><mo>=</mo><mi>H</mi></mrow><annotation encoding="application/x-tex">I=H</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.68333em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.07847em">I</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.68333em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.08125em">H</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">n=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.64444em;vertical-align:0"></span><span class="mord">1</span></span></span></span> 时,EMD与BERT解码器层相同。 不过,EMD更通用、更灵活,因为它可以使用各种类型的输入信息进行解码。</p><h4 id="c-虚拟对抗训练方法"><a class="markdownIt-Anchor" href="#c-虚拟对抗训练方法"></a> c) 虚拟对抗训练方法</h4><blockquote><p>对抗训练是NLPer经常使用的技术,在做比赛或者公司业务的时候一般都会使用对抗训练来提升模型的性能。DeBERTa预训练里面引入的对抗训练叫SiFT,它攻击的对象不是word embedding,而是embedding之后的layer norm。</p></blockquote><p>规模不变微调(Scale-invariant-Fine-Tuning SiFT)算法一种新的虚拟对抗训练算法, 主要用于模型的微调。</p><p>虚拟对抗训练是一种改进模型泛化的正则化方法。 它通过对抗性样本提高模型的鲁棒性,对抗性样本是通过对输入进行细微扰动而创建的。 对模型进行正则化,以便在给出特定于任务的样本时,该模型产生的输出分布与该样本的对抗性扰动所产生的输出分布相同。</p><p>对于之前的NLP任务,一般会把扰动应用于单词嵌入,而不是原始单词序列。 但是嵌入向量值的范围在不同的单词和模型之间有所不同。 对于具有数十亿个参数的较大模型,方差会变大,从而导致对抗训练有些不稳定。</p><p>受层归一化的启发,微软提出了SiFT算法,该算法通过应用扰动的归一化词嵌入来提高训练稳定性。 即在实验中将DeBERTa微调到下游NLP任务时,<strong>SiFT首先将单词嵌入向量归一化为随机向量,然后将扰动应用于归一化的嵌入向量。</strong> 实验表明,归一化大大改善了微调模型的性能。</p><h3 id="22-deberta-v2"><a class="markdownIt-Anchor" href="#22-deberta-v2"></a> 2.2 DeBERTa V2</h3><p>2021年2月微软放出的 V2 版本在 V1 版本的基础上又做了一些改进:</p><p>**1.词表:**在 v2 中,tokenizer扩的更大,从V1中的50K,变为 128K 的新词汇表。</p><p><strong>2.nGiE(nGram Induced Input Encoding)</strong> v2 模型在第一个转换器层之外使用了一个额外的卷积层,以更好地学习输入标记的依赖性。</p><p>**3.共享位置和内容的变换矩阵:**通过实验表明,这种方法可以在不影响性能的情况下保存参数。</p><p>**4.应用桶方法对相对位置进行编码:**v2 模型使用对数桶对相对位置进行编码。</p><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h6c6keuew1j20h003xjrr.jpg" srcset="/img/loading.gif" lazyload alt="image-20220919202037239"></p><blockquote><p>图3: DeBERTa V2优化结果对比</p><p>来源:<a href="https://arxiv.org/pdf/2006.03654.pdf" target="_blank" rel="noopener">https://arxiv.org/pdf/2006.03654.pdf</a></p></blockquote><p>优化结果:2.0版几个变更对模型的影响,增大词典效果最显著。</p><h3 id="23-deberta-v3"><a class="markdownIt-Anchor" href="#23-deberta-v3"></a> 2.3 DeBERTa V3</h3><p>2021年11月微软又放出了 V3 版本。<strong>这次的版本在模型层面并没有修改,而是将预训练任务由掩码语言模型(MLM)换成了ELECTRA一样类似GAN的RTD (Replaced token detect) 任务。</strong></p><p>我们知道BERT模型只使用了编码器层和MLM进行训练。而ELECTRA 使用 GAN 的思想,利用生成对抗网络构造两个编码器层进行对抗训练。其中一个是基于MLM训练的生成模型,另一个是基于二分类训练的判别模型。生成模型用于生成不确定的结果同时替换输入序列中的掩码标记,然后将修改后的输入序列送到判别模型。判别模型需要判断对应的 token 是原始 token 还是被生成器替换的 token。</p><p>不同的训练方法实验尝试:</p><ul><li>1、[ES]生成模型和判别模型共享embedding层训练;</li><li>2、[NES]生成模型和判别模型不共享embedding层,也不共享参数层,交替训练;</li><li>3、[GDES]生成模型和判别模型部分共享。</li></ul><p>通过实验表明:</p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h6c80yrwq8j20tu0f8q55.jpg" srcset="/img/loading.gif" lazyload alt="img" style="zoom:50%"><blockquote><p>图3: DeBERTa V3优化结果对比</p><p>来源:<a href="https://arxiv.org/pdf/2111.09543.pdf" target="_blank" rel="noopener">https://arxiv.org/pdf/2111.09543.pdf</a></p></blockquote><p>DeBERTa V3 在某些任务中相比之前模型有不小的涨幅,其中GDES模式优化效果最好。</p><h2 id="3相关code"><a class="markdownIt-Anchor" href="#3相关code"></a> 3.相关code</h2><p>DeBERTa官方文档,可以直接调库实现:</p><ul><li>DeBERTa code_1: <a href="https://deberta.readthedocs.io/en/latest/index.html" target="_blank" rel="noopener">https://deberta.readthedocs.io/en/latest/index.html</a></li></ul><p>haggingface实现DeBERTa,可以直接调库实现:</p><ul><li>DeBERTa code_2: <a href="https://huggingface.co/docs/transformers/model_doc/deberta" target="_blank" rel="noopener">https://huggingface.co/docs/transformers/model_doc/deberta</a></li></ul><p>官方源码:</p><ul><li>DeBERTa code_3: <a href="https://github.com/microsoft/DeBERTa" target="_blank" rel="noopener">https://github.com/microsoft/DeBERTa</a></li></ul><h2 id="4总结"><a class="markdownIt-Anchor" href="#4总结"></a> 4.总结</h2><ul><li>1.DeBERTa V1 相比 BERT 和 RoBERTa 模型的改进:<ul><li>两种技术改进:<ul><li>注意力解耦机制</li><li>增强的掩码解码器</li></ul></li><li>新的微调方法:虚拟对抗训练方法(SiFT)。</li></ul></li><li>2.DeBERTa V2 改进<ul><li>tokenizer扩的更大(优化效果最明显)</li><li>transformer外使用了额外的卷积层</li><li>共享位置和内容的变换矩阵</li><li>应用桶方法对相对位置进行编码</li></ul></li><li>3.DeBERTa V3 改进<ul><li>在模型层面并没有修改,将预训练任务MLM换成了ELECTRA一样类似GAN的RTD任务</li></ul></li></ul><h2 id="5参考文献"><a class="markdownIt-Anchor" href="#5参考文献"></a> 5.参考文献</h2><p>[1] SuperGLUE: <em><a href="https://super.gluebenchmark.com/leaderboard" target="_blank" rel="noopener">https://super.gluebenchmark.com/leaderboard</a></em></p><p>[2] DeBERTa: <a href="https://arxiv.org/pdf/2006.03654.pdf" target="_blank" rel="noopener">https://arxiv.org/pdf/2006.03654.pdf</a></p><p>[3] DeBERTa 2.0: <a href="https://huggingface.co/docs/transformers/model_doc/deberta-v2" target="_blank" rel="noopener">https://huggingface.co/docs/transformers/model_doc/deberta-v2</a></p><p>[4] DeBERTa 3.0: <a href="https://arxiv.org/pdf/2111.09543.pdf" target="_blank" rel="noopener">https://arxiv.org/pdf/2111.09543.pdf</a></p><p>[5] 微软 deDERTa 官网: <a href="https://www.microsoft.com/en-us/research/blog/microsoft-deberta-surpasses-human-performance-on-the-superglue-benchmark/?lang=fr_ca" target="_blank" rel="noopener">https://www.microsoft.com/en-us/research/blog/microsoft-deberta-surpasses-human-performance-on-the-superglue-benchmark/?lang=fr_ca</a></p>]]></content>
<categories>
<category>自然语言处理</category>
</categories>
<tags>
<tag>NLP</tag>
</tags>
</entry>
<entry>
<title>RoBERTa:一种稳健优化BERT的预训练方法</title>
<link href="/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/NLP/RoBERTa%EF%BC%9A%E4%B8%80%E7%A7%8D%E7%A8%B3%E5%81%A5%E4%BC%98%E5%8C%96BERT%E7%9A%84%E9%A2%84%E8%AE%AD%E7%BB%83%E6%96%B9%E6%B3%95/"/>
<url>/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/NLP/RoBERTa%EF%BC%9A%E4%B8%80%E7%A7%8D%E7%A8%B3%E5%81%A5%E4%BC%98%E5%8C%96BERT%E7%9A%84%E9%A2%84%E8%AE%AD%E7%BB%83%E6%96%B9%E6%B3%95/</url>
<content type="html"><![CDATA[<h2 id="摘要"><a class="markdownIt-Anchor" href="#摘要"></a> 摘要</h2><p>语言模型的预训练带来了显著的性能提高,但比较不同的方法具有一定的挑战性。因为其训练的计算成本很高,同时不同的模型通常又是在不同规模的私有数据集上进行的,而且超参数选择也会对最终结果有重大影响。我们提出了BERT预训练的研究(Devlin等人,2019年),测量了许多关键超参数和训练数据大小的影响。在实验中,发现了BERT模型的一些问题,同时提出一种新的模型,这种模型可以匹配或超过BERT后发布的每一个模型的性能。我们最好的模型在GLUE, RACE和SQuAD上取得了最先进的结果。这些结果突出了以前忽略的设计选择的重要性。基于此,我们发布了其模型和代码。</p><h2 id="1-文章介绍"><a class="markdownIt-Anchor" href="#1-文章介绍"></a> 1 文章介绍</h2><p>自训练方法,如 ELMo (Peters et al., 2018)、GPT (Radford et al., 2018)、BERT (Devlin et al., 2019)、XLM (Lample and Conneau, 2019) 和 XLNet (Yang et al., 2019) al., 2019) 带来了显着的性能提升,但要确定这些方法的哪些方面贡献最大可能具有挑战性。 因为训练的计算成本很高,限制了我们对模型的微调,还有不同模型通常使用未公开的私人训练数据完成,进一步限制了我们衡量模型的效果。</p><p>我们提出了 BERT 预训练的进一步研究(Devlin 等人,2019 年),其中包括评估超参数调整和训练集大小的影响。 我们发现 了BERT 训练中的不足,并提出了一种改进的 BERT 模型训练方法,我们称之为 RoBERTa,它可以匹配或超过所有后 BERT 方法的性能。 我们的修改很简单,<strong>它们包括:(1)训练模型的时间更长,批量更大,数据更多; (2) 去除下一句预测目标; (3) 较长序列的训练; (4) 动态改变应用于训练数据的遮掩模式。 我们还收集了一个与其他私人使用的数据集相当大小的大型新数据集(CC-NEWS),以更好地控制训练集大小的影响。</strong></p><p>在控制训练数据时,我们改进的训练方法突破了 GLUE 和 SQuAD 上已发布的 BERT 结果。 当对额外数据进行更长时间的训练时,我们的模型在公共 GLUE数据集排行榜上的得分为 88.5,与 Yang 等人报告的 88.4 相匹配(2019)。 我们的模型在 4/9 的 GLUE 任务:MNLI、QNLI、RTE 和 STS-B 上的评分达到了新高度。 我们在 SQuAD 和 RACE 上也获得了最高的得分。 总体而言,我们重新确定 BERT 的掩码语言模型与其他最近提出的训练方法(例如扰动自回归语言建模(Yang 等人,2019))具有相同的竞争力(Yang 等人,2019)。</p><p>综上所述,<strong>本文的贡献在于(1)我们提出了一组重要的 BERT 设计选择和训练策略,并引入了能够提高下游任务性能的替代方案; (2) 我们使用新的数据集 CC-NEWS,并确认使用更多数据进行预训练可以进一步提高下游任务的性能; (3) 我们的训练改进表明,在正确的设计选择下,掩码类语言模型预训练与所有其他最近发布的方法相比依旧具有很强竞争力。</strong> 我们利用PyTorch 实现了该模型、以及预训练和微调代码。</p><h2 id="2-背景"><a class="markdownIt-Anchor" href="#2-背景"></a> 2 背景</h2><p>在本节中,我们简要概述了 BERT (Devlin et al., 2019) 预训练方法以及我们将在下一节中通过实验检查的一些调优方法。</p><h3 id="21-初始设置"><a class="markdownIt-Anchor" href="#21-初始设置"></a> 2.1 初始设置</h3><p>BERT 将两部分<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo separator="true">,</mo><msub><mi>x</mi><mi>N</mi></msub></mrow><annotation encoding="application/x-tex">x_1,... ,x_N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:.10903em">N</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>y</mi><mn>1</mn></msub><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo separator="true">,</mo><msub><mi>y</mi><mi>M</mi></msub></mrow><annotation encoding="application/x-tex">y_1,..., y_M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:.10903em">M</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span> 的串联作为输入。 这两个片段作为单个输入序列呈现给 BERT,并用特殊标记分隔它们:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">[</mo><mi>C</mi><mi>L</mi><mi>S</mi><mo stretchy="false">]</mo><mo separator="true">,</mo><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo separator="true">,</mo><msub><mi>x</mi><mi>N</mi></msub><mo separator="true">,</mo><mo stretchy="false">[</mo><mi>S</mi><mi>E</mi><mi>P</mi><mo stretchy="false">]</mo><mo separator="true">,</mo><msub><mi>y</mi><mn>1</mn></msub><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo separator="true">,</mo><msub><mi>y</mi><mi>M</mi></msub><mo separator="true">,</mo><mo stretchy="false">[</mo><mi>E</mi><mi>O</mi><mi>S</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">[CLS],x_1,...,x_N,[SEP],y_1,...,y_M,[EOS]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:.07153em">C</span><span class="mord mathdefault">L</span><span class="mord mathdefault" style="margin-right:.05764em">S</span><span class="mclose">]</span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:.10903em">N</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:.05764em">S</span><span class="mord mathdefault" style="margin-right:.05764em">E</span><span class="mord mathdefault" style="margin-right:.13889em">P</span><span class="mclose">]</span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:.10903em">M</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:.05764em">E</span><span class="mord mathdefault" style="margin-right:.02778em">O</span><span class="mord mathdefault" style="margin-right:.05764em">S</span><span class="mclose">]</span></span></span></span>。 对M 和 N 约束是 M + N < T ,其中 T 是控制训练期间最大序列长度的参数。<br>该模型首先在大型未标记文本语料库上进行预训练,然后使用最终任务标记数据进行微调。</p><h3 id="22-结构说明"><a class="markdownIt-Anchor" href="#22-结构说明"></a> 2.2 结构说明</h3><p>BERT 使用了 Transformer 架构(Vaswani 等人,2017 年),我们不会对其进行详细回顾。 我们使用具有 L 层的Transformer结构。 每个块使用的自注意头为A个,隐藏维度为 H。</p><h3 id="23-训练目标"><a class="markdownIt-Anchor" href="#23-训练目标"></a> 2.3 训练目标</h3><p>BERT的预训练模型会考虑两个任务:带掩码的语言模型和下一句预测任务。</p><p>带掩码的语言模型 (Masked Language Model, MLM) 在输入序列中随机样本替换为特殊标记 [MASK]。 MLM是预测掩码标记的交叉熵损失。 BERT 首先统一选择 15% 的输入标记。 在选定的标记中,80% 被 [MASK] 替换,10% 保持不变,10% 被随机选择的词汇标记替换。<br>在最初的实现中,随机掩码和替换在开始时执行一次,然后在训练期间保存。同时在整个训练过程中,虽然数据是一样的,但是每个训练句子的掩码并不会保持一致(参见第 4.1 节)。</p><p>下一句预测(Next Sentence Prediction NSP)是一种二元分类损失,用于预测原始文本中两段是否相连。通过从文本语料库中提取连续句子来创建正样本。负样本是通过将不同文档中的片段配对来创建的。以相等的概率采样正、负样本。</p><p>NSP目标旨在提高下游任务的性能,如自然语言推理(Bowman等人,2015),该任务需要对句子之间的关系进行推理。</p><h3 id="24-优化方法"><a class="markdownIt-Anchor" href="#24-优化方法"></a> 2.4 优化方法</h3><p>通过Adam(Kingma和Ba,2015)使用以下参数对BERT进行优化:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>β</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">β_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.8888799999999999em;vertical-align:-.19444em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.05278em">β</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.05278em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>=0.9,<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>β</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">β_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.8888799999999999em;vertical-align:-.19444em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.05278em">β</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.05278em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>=0.999,<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>ϵ</mi><mo>=</mo><mn>1</mn><mi>e</mi><mo>−</mo><mn>6</mn></mrow><annotation encoding="application/x-tex">\epsilon=1e-6</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault">ϵ</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.72777em;vertical-align:-.08333em"></span><span class="mord">1</span><span class="mord mathdefault">e</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">−</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.64444em;vertical-align:0"></span><span class="mord">6</span></span></span></span>,L2的衰减权重为0.01。在前10000个步骤中,学习速率被设定到1e-4的峰值,然后线性衰减。BERT训练时,所有层和注意力权重上的 dropout 均为0.1,并增加了GELU激活函数(Hendrycks和Gimpel,2016)。模型预训练更新参数:S=1000000,小批量设定参数:B=256,最大长度token:T=512。</p><h3 id="25-数据介绍"><a class="markdownIt-Anchor" href="#25-数据介绍"></a> 2.5 数据介绍</h3><p>BERT使用了BOOKCORPUS(Zhu等人,2015)和英语维基百科的组合共16GB的未压缩文本进行训练。</p><h2 id="3-实验设置"><a class="markdownIt-Anchor" href="#3-实验设置"></a> 3 实验设置</h2><p>在本节中,我们描述了BERT复现研究的实验设置。</p><h3 id="31-初始启动"><a class="markdownIt-Anchor" href="#31-初始启动"></a> 3.1 初始启动</h3><p>我们在FAIRSEQ(Ott等人,2019年)中重新实现了BERT。我们主要使用了第2节中给出的原始BERT优化超参数,但峰值学习率和步骤数除外,这两个参数会针对每个设置进行调整。此外,我们还发现训练对Adam非常敏感,在某些情况下,我们在微调后获得了更好的性能。同样,我们发现设置<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>β</mi><mn>2</mn></msub><mo>=</mo><mn>0.98</mn></mrow><annotation encoding="application/x-tex">β_2=0.98</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.8888799999999999em;vertical-align:-.19444em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.05278em">β</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.05278em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.64444em;vertical-align:0"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">9</span><span class="mord">8</span></span></span></span>可以提高大批量训练时的稳定性。<br>我们使用token最大值为T=512进行预训练。与Devlin等人(2019年)不同,我们不会随机增加短序列,也不会在前90%的更新中使用缩短的序列长度进行训练,而是使用全长序列进行训练。<br>我们在DGX-1机器上使用混合精度浮点算法进行训练,每台机器配备为:8×32GB Nvidia V100 GPU。</p><h3 id="32-数据介绍"><a class="markdownIt-Anchor" href="#32-数据介绍"></a> 3.2 数据介绍</h3><p>bert类模型的预训练非常依赖于大量的文本。Baevski等人(2019)指出,增加数据量可以改善最终任务的性能。之前一些研究已经在比原始BERT更大、更多样化的数据集上进行了训练(Radford等人,2019年;Yang等人,2019;Zellers等人,2019年)。不幸的是,并不是所有额外的数据集都被公开。对于我们的研究,我们专注于收集尽可能多的数据进行实验,使我们能够匹配数据的总体质量和数量,进而适应每次的结果比较。</p><p>我们考虑了五个不同领域的英语语料库,总共超过160GB的未压缩文本。主要使用了以下文本语料库:</p><ul><li><p>BOOKCORPUS (Zhu et al., 2015)加上英文维基百科。这是用来训练BERT的原始数据。(16GB)。</p></li><li><p>CC-NEWS,从CommonCrawl新闻数据集的英语部分收集(Nagel, 2016)到的数据。该数据包含2016年9月至2019年2月期间的6300万篇英语新闻文章。(过滤后包含76GB)</p></li><li><p>OPENWEBTEXT (Gokaslan和Cohen, 2019), Radford等人(2019)描述的WebText语料库的开源数据。这部分数据是从Reddit上分享的url中提取的web内容。(38GB)</p></li><li><p>STORIES,一个在Trinh和Le(2018)中引入的数据集,包含CommonCrawl数据的子集,用来匹配Winograd模式的故事风格。(31 GB)。</p></li></ul><h3 id="33-评估方法"><a class="markdownIt-Anchor" href="#33-评估方法"></a> 3.3 评估方法</h3><p>在之前的研究中,我们使用以下三个基准来评估我们在下游任务中预训练的模型。</p><p><strong>通用语言理解评估(The General Language Understanding Evaluation GLUE)方法</strong>(Wang et al., 2019b)由9个数据集组成,用于评估自然语言理解系统。任务分为单句分类任务和句子对分类任务。GLUE官方会提供分割好的数据,以及一个提交服务器和允许参与者根据私人测试数据评估和比较他们系统的排行榜。</p><p>在第4节的研究中,我们介绍了在相应的单任务训练数据上微调预训练模型后的结果。我们的微调过程和最初的BERT论文保持一致(Devlin et al., 2019)。</p><p>在第5节中,我们另外介绍了从公共排行榜中获得的测试集结果。这些结果依赖于一些特定任务的修改。</p><p>SQuAD斯坦福问答数据集(The Stanford Question Answering Dataset SQuAD)提供了一段上下文和一个问题。其任务是从上下文中提取相关答案来回答这个问题。我们评估了《SQuAD》的两个版本:V1.1和V2.0 (Rajpurkar et al., 2016年和2018年)。在V1.1中,上下文中总是包含一个答案,而在V2.0中,有些问题在提供的上下文中没有得到回答,这使得任务更具挑战性。<br>对于SQuAD V1.1,我们采用与BERT (Devlin et al., 2019)相同的预测方法。对于SQuAD V2.0,我们添加了一个额外的二元分类器来预测问题是否可回答,我们通过对分类项和损失项求和来联合训练该模型。在评估过程中,我们只预测分类为可回答的范围。</p><p>RACE (The ReAding Comprehension from Examinations )(Lai et al., 2017)任务是一个大型阅读理解数据集,包含超过2.8万篇文章和近10万个问题。该数据集来自中国的英语考试,专为初高中学生设计。在RACE中,每一篇文章都有多个问题。每个问题的任务是从四个选项中选择一个正确答案。RACE比其他流行的阅读理解数据集有更长的上下文,并且需要推理的问题的比例更大。</p><h2 id="4-训练过程分析"><a class="markdownIt-Anchor" href="#4-训练过程分析"></a> 4 训练过程分析</h2><p>本节将探索哪些选择对成功预训练BERT模型比较重要。我们保持模型体系结构不变。具体来说,我们在训练BERT模型时使用与<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mi>E</mi><mi>R</mi><msub><mi>T</mi><mrow><mi>B</mi><mi>A</mi><mi>S</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">BERT_{BASE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.05017em">B</span><span class="mord mathdefault" style="margin-right:.05764em">E</span><span class="mord mathdefault" style="margin-right:.00773em">R</span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.05017em">B</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.05764em">S</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>相同的配置(L = 12, H = 768, A = 12, 110M参数)。</p><h3 id="41-动-静态掩码对比"><a class="markdownIt-Anchor" href="#41-动-静态掩码对比"></a> 4.1 动、静态掩码对比</h3><p>正如第2节所讨论的,BERT依赖于随机掩码和预测token。原始的BERT实现在数据预处理过程中只进行一次掩码,产生单一的静态掩码。为了避免在每个epoch中对训练实例使用相同的掩码,训练数据被复制10份,以便每个序列在40个训练epoch中以10种不同的方式进行掩码。所以,每个训练序列在训练过程中使用相同的掩码训练4次。<br>我们将此策略与动态掩码进行比较。**在动态掩码中,每次向模型提供序列时都会生成掩码。**当需要更多的步骤或更大的数据集进行预训练时,这一点的影响将非常大。</p><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h57grjt545j20et05jglv.jpg" srcset="/img/loading.gif" lazyload alt="image-20220815150326591"></p><blockquote><p>表1: <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mi>E</mi><mi>R</mi><msub><mi>T</mi><mrow><mi>B</mi><mi>A</mi><mi>S</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">BERT_{BASE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.05017em">B</span><span class="mord mathdefault" style="margin-right:.05764em">E</span><span class="mord mathdefault" style="margin-right:.00773em">R</span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.05017em">B</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.05764em">S</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>静态屏蔽和动态屏蔽的比较。我们统计了SQuAD的F1值,以及MNLI-m和SST-2的准确性。结果是5个随机初始化(种子)的中值。参考结果来自Yang等人(2019)。</p></blockquote><p>表1比较了Devlin等人(2019)发布的<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mi>E</mi><mi>R</mi><msub><mi>T</mi><mrow><mi>B</mi><mi>A</mi><mi>S</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">BERT_{BASE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.05017em">B</span><span class="mord mathdefault" style="margin-right:.05764em">E</span><span class="mord mathdefault" style="margin-right:.00773em">R</span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.05017em">B</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.05764em">S</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>结果与我们重新实现静态或动态掩码的结果。我们发现,采用静态掩码的重新实现与原始BERT模型的性能相似,而动态掩码略好于静态掩码。<br>考虑到这些结果和动态掩码的额外效益,我们在接下来的实验中使用动态掩码。</p><h3 id="42-模型输入规范化和下一句预测"><a class="markdownIt-Anchor" href="#42-模型输入规范化和下一句预测"></a> 4.2 模型输入规范化和下一句预测</h3><p>在原始BERT预训练过程中,模型会观察两个连接的句子内容,它们要么从同一文档(p = 0.5)连续采样,要么从不同的文档采样。除了构建带掩码的语言模型(MLM)外,该模型还通过衡量下一句预测(NSP)损失来预测观察到的文档片段是否来自相同的文档。<br>假设下一句预测的损失是训练原始BERT模型的一个重要因素。Devlin等人(2019)观察到,去除NSP会损害性能,将会使QNLI、MNLI和SQuAD 1.1的性能显著下降。然而,最近的一些研究对NSP损失的必要性提出了质疑(Lample和Conneau, 2019;Yang等人,2019;Joshi等人,2019年)。<br>为了更好地理解这种差异,我们比较了几种不同的训练形式:</p><ul><li>SEGMENT-PAIR+NSP: 这遵循BERT (Devlin等人,2019)中使用的原始输入格式,带有NSP损失。每个输入都有一对片段,每个片段可以包含多个自然句子,但组合的总长度必须小于512个token。此处我们保留了NSP的损失。</li><li>SENTENCE-PAIR+NSP: 每个输入包含一对自然句子,或者从一个文档的连续部分采样,或者从单独的文档采样。由于这些输入明显少于512个token,因此我们增加了批处理大小,使token的总数保持类似于SEGMENT-PAIR+NSP。此处我们保留了NSP的损失。</li><li>FULL-SENTENCES: 每个输入都包含从一个或多个文档连续采样的完整句子,因此总长度最多为512个token。输入可以跨越文档边界。当到达一个文档末尾时,我们开始对下一个文档中的句子进行采样,并在文档之间添加额外的分隔符。此处我们移除了NSP损失评估。</li><li>DOC-SENTENCES: 输入的构造类似于完整句子,只是它们不能跨越文档边界。在文档末尾采样的输入可能小于512个token,因此我们在这些情况下动态地增加批处理大小,以达到与FULL- sentence相似的标记总数。我们移除了NSP损失评估。</li></ul><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h57hah9hkmj20kp0a775k.jpg" srcset="/img/loading.gif" lazyload alt="image-20220815152046808"></p><blockquote><p>表2: 在BOOKCORPUS和WIKIPEDIA上预训练的基本模型结果。所有模型训练1M 步,批大小256。我们计算了SQuAD的F1值,MNLI-m、SST-2和RACE的准确性。结果是五个随机初始化(种子)的中值。<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mi>E</mi><mi>R</mi><msub><mi>T</mi><mrow><mi>B</mi><mi>A</mi><mi>S</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">BERT_{BASE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.05017em">B</span><span class="mord mathdefault" style="margin-right:.05764em">E</span><span class="mord mathdefault" style="margin-right:.00773em">R</span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.05017em">B</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.05764em">S</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mi>L</mi><mi>N</mi><mi>e</mi><msub><mi>t</mi><mrow><mi>B</mi><mi>A</mi><mi>S</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">XLNet_{BASE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.07847em">X</span><span class="mord mathdefault">L</span><span class="mord mathdefault" style="margin-right:.10903em">N</span><span class="mord mathdefault">e</span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.05017em">B</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.05764em">S</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>的结果来自Yang等人(2019)。</p></blockquote><p>表2显示了四种不同设置的实验结果。我们首先比较了Devlin等人(2019)的原始SEGMENT-PAIR输入格式和SENTENCE-PAIR格式;两种格式都保留了NSP损失,但后者使用单个句子。我们发现,使用单独的句子会损害后续任务的表现,我们认为这是因为模型无法学习长期依赖。</p><p>接下来,我们比较没有NSP损失的训练和使用单个文档中的文本块(DOC-SENTENCES)的训练。我们发现,与Devlin等人(2019)相比,该设置优于最初公布的<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mi>E</mi><mi>R</mi><msub><mi>T</mi><mrow><mi>B</mi><mi>A</mi><mi>S</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">BERT_{BASE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.05017em">B</span><span class="mord mathdefault" style="margin-right:.05764em">E</span><span class="mord mathdefault" style="margin-right:.00773em">R</span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.05017em">B</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.05764em">S</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>结果,删除NSP损失略微改善了下游任务的性能。原始的BERT实现可能只删除了损失项,而仍然保留SEGMENT-PAIR输入格式。</p><p>最后,我们发现限制来自单个文档的序列(DOC-SENTENCES)比来自多个文档的序列(FULL-SENTENCES)性能略好。然而,由于DOC-SENTENCES格式导致的批处理大小不同,我们在其余实验中仍然使用FULL-SENTENCES,以便与相关工作进行更容易的比较。</p><h3 id="43-大批量训练"><a class="markdownIt-Anchor" href="#43-大批量训练"></a> 4.3 大批量训练</h3><p>之前的神经机器翻译工作表明,当学习率适当提高时,使用非常大的小批量训练可以提高优化速度和结束任务的性能(Ott et al., 2018)。最近的研究也表明了BERT同样适用于大规模批量训练(You等人,2019年)。</p><p>Devlin等人(2019)最初对<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mi>E</mi><mi>R</mi><msub><mi>T</mi><mrow><mi>B</mi><mi>A</mi><mi>S</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">BERT_{BASE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.05017em">B</span><span class="mord mathdefault" style="margin-right:.05764em">E</span><span class="mord mathdefault" style="margin-right:.00773em">R</span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.05017em">B</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.05764em">S</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>进行了1M 步、批大小为256的训练。通过梯度积累,这在计算成本上等价于批量大小为2K、125K步或批量大小为8K、31K步的训练。</p><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h57htsikvfj20ea04awep.jpg" srcset="/img/loading.gif" lazyload alt="image-20220815154204236"></p><blockquote><p>表3: 在不同批处理大小(bsz)的BOOKCORPUS和WIKIPEDIA上训练的基本模型上对训练数据(ppl)的困惑度和准确性。我们调整了每个设置的学习率(lr);模型传递数据的次数(epoch)是相同的,同时计算资源也是相同的。</p></blockquote><p>在表3中,我们比较了随着批处理规模的增加,<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mi>E</mi><mi>R</mi><msub><mi>T</mi><mrow><mi>B</mi><mi>A</mi><mi>S</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">BERT_{BASE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.05017em">B</span><span class="mord mathdefault" style="margin-right:.05764em">E</span><span class="mord mathdefault" style="margin-right:.00773em">R</span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.05017em">B</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.05764em">S</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>的复杂度和结束任务性能,并控制了通过训练数据的次数。我们观察到,大批量训练提高了掩码语言建模目标的困惑度和结束任务的准确性。通过分布式数据并行训练,大批量的数据也更容易并行化,在后面的实验中,我们使用批量大小值为8K进行训练。<br>值得注意的是,You等人(2019)使用更大的批大小训练BERT模型,最多达到32K的批量。该部分工作我们在本文中不做讨论,留给后来的学者进一步研究。</p><h3 id="44-文本编码"><a class="markdownIt-Anchor" href="#44-文本编码"></a> 4.4 文本编码</h3><p>字节对编码(Byte-Pair Encoding BPE) (Sennrich等人,2016)是字符级和单词级表示的混合,它可以处理自然语言语料库中常见的大型词汇。BPE依赖于子词单元,通过对训练语料库进行统计分析来提取子词单元,而不是全部词汇。<br>BPE词汇量通常在10K-100K子词单位之间。然而,在建模大型和多样化的语料库(如本工作中考虑的语料库)时,unicode字符可以占这个词汇表的相当大的一部分。Radford等人(2019)引入了一种巧妙的BPE实现,它使用字节而不是 unicode 字符作为基本子字单元。使用字节可以学习中等大小(50K单位)的子单词词汇表,它仍然可以在不引入任何未知标记的情况下对任何输入文本进行编码。</p><p>原始BERT实现(Devlin等人,2019年)使用了一个大小为30K的字符级BPE词汇表,该词汇表是在使用启发式标记规则下对输入进行预处理后学习的。在Radford等人(2019)之后,我们考虑使用包含50K子词单元的更大字节的BPE词汇表来训练BERT,而不需要对输入进行任何额外的预处理或标记。这分别为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mi>E</mi><mi>R</mi><msub><mi>T</mi><mrow><mi>B</mi><mi>A</mi><mi>S</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">BERT_{BASE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.05017em">B</span><span class="mord mathdefault" style="margin-right:.05764em">E</span><span class="mord mathdefault" style="margin-right:.00773em">R</span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.05017em">B</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.05764em">S</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mi>E</mi><mi>R</mi><msub><mi>T</mi><mrow><mi>L</mi><mi>A</mi><mi>R</mi><mi>G</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">BERT_{LARGE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.05017em">B</span><span class="mord mathdefault" style="margin-right:.05764em">E</span><span class="mord mathdefault" style="margin-right:.00773em">R</span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">L</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.00773em">R</span><span class="mord mathdefault mtight">G</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>增加了大约15M和20M的额外参数。<br>早期的实验显示,这些编码之间只有轻微的差异,Radford等人(2019)的BPE在某些结束任务表现略差。尽管如此,我们相信通用编码方案的优势大于性能上的轻微下降,并在我们的其余实验中使用这种编码。这些编码更详细的比较留给以后的工作。</p><h2 id="5-roberta"><a class="markdownIt-Anchor" href="#5-roberta"></a> 5 RoBERTa</h2><p>在前一节中,我们讨论了对BERT预训练过程进行修改,以提高结束任务的性能。现在,我们将汇总这些改进并评估它们的综合影响。我们将这种配置称为RoBERTa,用于健壮优化BERT方法。具体来说,RoBERTa使用动态屏蔽(章节4.1)、没有NSP损失的完整句子(章节4.2)、大的小批量(章节4.3)和更大的字节级BPE(章节4.4)进行训练。</p><p>此外,我们研究了其他两个在之前的工作中被忽视的重要因素:<br>(1) 用于预训练的数据<br>(2) 训练通过数据的次数<br>例如,最近提出的XLNet架构(Yang等人,2019年)是使用比原始BERT多近10倍的数据进行预训练的(Devlin等人,2019年)。它的批大小是BERT的8倍,优化步骤是BERT的一半。</p><p>为了帮助从其他建模选择中分离出这些因素的重要性(例如,训练前目标),我们开始按照<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mi>E</mi><mi>R</mi><msub><mi>T</mi><mrow><mi>L</mi><mi>A</mi><mi>R</mi><mi>G</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">BERT_{LARGE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.05017em">B</span><span class="mord mathdefault" style="margin-right:.05764em">E</span><span class="mord mathdefault" style="margin-right:.00773em">R</span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">L</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.00773em">R</span><span class="mord mathdefault mtight">G</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>架构(L = 24, H = 1024, A = 16,355M参数)训练RoBERTa。我们在Devlin等人(2019)使用的可比较的BOOK-CORPUS + WIKIPEDIA数据集上预训练100K步,使用1024 V100 GPU对模型进行了大约一天的预训练。</p><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h57ipozdhtj20nz0bcmyo.jpg" srcset="/img/loading.gif" lazyload alt="image-20220815161158982"></p><blockquote><p>表4:当我们预训练更多的数据(16GB→160GB的文本)和更长的预训练(100K→300K→500K步骤)时,RoBERTa的结果展示。RoBERTa与<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mi>E</mi><mi>R</mi><msub><mi>T</mi><mrow><mi>L</mi><mi>A</mi><mi>R</mi><mi>G</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">BERT_{LARGE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.05017em">B</span><span class="mord mathdefault" style="margin-right:.05764em">E</span><span class="mord mathdefault" style="margin-right:.00773em">R</span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">L</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.00773em">R</span><span class="mord mathdefault mtight">G</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>的架构和训练目标相匹配。<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mi>E</mi><mi>R</mi><msub><mi>T</mi><mrow><mi>L</mi><mi>A</mi><mi>R</mi><mi>G</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">BERT_{LARGE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.05017em">B</span><span class="mord mathdefault" style="margin-right:.05764em">E</span><span class="mord mathdefault" style="margin-right:.00773em">R</span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">L</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.00773em">R</span><span class="mord mathdefault mtight">G</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mi>L</mi><mi>N</mi><mi>e</mi><msub><mi>t</mi><mrow><mi>L</mi><mi>A</mi><mi>R</mi><mi>G</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">XLNet_{LARGE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.07847em">X</span><span class="mord mathdefault">L</span><span class="mord mathdefault" style="margin-right:.10903em">N</span><span class="mord mathdefault">e</span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">L</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.00773em">R</span><span class="mord mathdefault mtight">G</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>的结果分别来自Devlin等人(2019)和Yang等人(2019)。所有GLUE任务的完成结果可以在附录中找到。</p></blockquote><p>在表4中展示了训练的结果。当控制训练数据时,我们观察到RoBERTa比最初报告的<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mi>E</mi><mi>R</mi><msub><mi>T</mi><mrow><mi>L</mi><mi>A</mi><mi>R</mi><mi>G</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">BERT_{LARGE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.05017em">B</span><span class="mord mathdefault" style="margin-right:.05764em">E</span><span class="mord mathdefault" style="margin-right:.00773em">R</span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">L</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.00773em">R</span><span class="mord mathdefault mtight">G</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>结果有很大的改进,这再一步证明了我们在第4节中探讨的设计选择的重要性。</p><p>接下来,我们将这些数据与3.2节中描述的另外三个数据集结合起来。我们使用与之前相同数量的训练步骤(100K)在组合数据上训练RoBERTa。我们总共预训练了超过160GB的文本。我们观察到所有下游任务的性能进一步提高,验证了数据大小和预训练多样性的重要性。</p><p>最后,我们对RoBERTa进行了更长的预训练,将预训练步数从100K增加到300K,再进一步增加到500K。我们再次观察到下游任务性能的显著提高,300K和500K步模式在大多数任务中优于<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mi>L</mi><mi>N</mi><mi>e</mi><msub><mi>t</mi><mrow><mi>L</mi><mi>A</mi><mi>R</mi><mi>G</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">XLNet_{LARGE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.07847em">X</span><span class="mord mathdefault">L</span><span class="mord mathdefault" style="margin-right:.10903em">N</span><span class="mord mathdefault">e</span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">L</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.00773em">R</span><span class="mord mathdefault mtight">G</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>。我们注意到,即使我们训练时间最长的模型也不会过度拟合我们的数据,会从额外的训练中受益。</p><p>在本文的剩余部分,我们在三个不同的基准上评估我们最好的RoBERTa模型:GLUE, SQuaD和RACE。</p><h3 id="51-在glue上的结果"><a class="markdownIt-Anchor" href="#51-在glue上的结果"></a> 5.1 在GLUE上的结果</h3><p>对于GLUE,我们考虑两种微调设置。在第一个设置(single-task, dev)中,我们对GLUE任务微调了RoBERTa,只使用对应任务的训练数据。对于每个任务,我们考虑一个有限的超参数集,其批大小∈{16,32},学习率∈{1e−5,2e−5,3e−5},在前6%的步骤中进行线性递增,然后线性衰减到0。我们调整了10个epoch,并基于开发集上的每个任务评估指标执行early stopping。其余超参数与训练前保持一致。在这个设置中,我们观察了在五个随机初始化中每个任务的中值结果,并没有模型集成。</p><p>在第二个设置(ensembles, test)中,我们通过GLUE排行榜将RoBERTa与测试集上的其他方法进行比较。GLUE排行榜的许多提交都依赖于多任务微调,而我们的提交只依赖于单任务微调。对于RTE、STS和MRPC,我们发现从MNLI单任务模型开始进行微调是有帮助的,而不是从基线预训练RoBERTa开始。我们探索了一个稍微宽一些的超参数空间,具体内容见附录。</p><p>GLUE的两个任务需要特定任务的微调方法,以获得具有竞争力的排行榜结果。</p><p>QNLI: GLUE排行榜上最近提交的结果采用了QNLI任务的两两排序公式(Liu et al., 2019b,a;Yang等人,2019)。这种公式大大简化了评估任务,但不能直接与BERT相比(Devlin et al., 2019)。根据最近的工作,我们的测试提交采用了排序方法,但是为了与BERT直接比较,我们也产出了基于纯分类方法的结果。</p><p>WNLI: 我们发现提供的NLI-format的WNLI数据处理起来很有挑战性。所以我们使用来自Super- GLUE (Wang et al., 2019a)重新格式化的WNLI数据,它用于表示查询代词和指示物的跨度。我们使用Kocijan等人(2019)的利润率排名损失对RoBERTa进行微调。对于给定的输入句子,我们使用space (Honnibal and Montani, 2017)从句子中提取额外的候选名词短语,并对我们的模型进行微调。</p><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h57j9xejj0j20s60a2768.jpg" srcset="/img/loading.gif" lazyload alt="image-20220815163209750"></p><blockquote><p>表5:GLUE的结果。所有结果都基于24层架构。<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mi>E</mi><mi>R</mi><msub><mi>T</mi><mrow><mi>L</mi><mi>A</mi><mi>R</mi><mi>G</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">BERT_{LARGE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.05017em">B</span><span class="mord mathdefault" style="margin-right:.05764em">E</span><span class="mord mathdefault" style="margin-right:.00773em">R</span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">L</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.00773em">R</span><span class="mord mathdefault mtight">G</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mi>L</mi><mi>N</mi><mi>e</mi><msub><mi>t</mi><mrow><mi>L</mi><mi>A</mi><mi>R</mi><mi>G</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">XLNet_{LARGE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.07847em">X</span><span class="mord mathdefault">L</span><span class="mord mathdefault" style="margin-right:.10903em">N</span><span class="mord mathdefault">e</span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">L</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.00773em">R</span><span class="mord mathdefault mtight">G</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>的结果分别来自Devlin等人(2019)和Yang等人(2019)。开发集上的RoBERTa结果是五次运行的中位数。测试集上的RoBERTa结果是单任务模型的集合。对于RTE、STS和MRPC,我们从MNLI模型而不是基线预训练模型开始进行微调。平均数据来自GLUE排行榜。</p></blockquote><p>在表5中展示了我们的结果。在第一种设置(single-task, dev)中,RoBERTa在所有9个GLUE任务开发集上都取得了最先进的结果。同时,RoBERTa使用与<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mi>E</mi><mi>R</mi><msub><mi>T</mi><mrow><mi>L</mi><mi>A</mi><mi>R</mi><mi>G</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">BERT_{LARGE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.05017em">B</span><span class="mord mathdefault" style="margin-right:.05764em">E</span><span class="mord mathdefault" style="margin-right:.00773em">R</span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">L</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.00773em">R</span><span class="mord mathdefault mtight">G</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>相同的掩码语言建模预训练目标和架构,但始终优于<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mi>E</mi><mi>R</mi><msub><mi>T</mi><mrow><mi>L</mi><mi>A</mi><mi>R</mi><mi>G</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">BERT_{LARGE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.05017em">B</span><span class="mord mathdefault" style="margin-right:.05764em">E</span><span class="mord mathdefault" style="margin-right:.00773em">R</span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">L</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.00773em">R</span><span class="mord mathdefault mtight">G</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mi>L</mi><mi>N</mi><mi>e</mi><msub><mi>t</mi><mrow><mi>L</mi><mi>A</mi><mi>R</mi><mi>G</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">XLNet_{LARGE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.07847em">X</span><span class="mord mathdefault">L</span><span class="mord mathdefault" style="margin-right:.10903em">N</span><span class="mord mathdefault">e</span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">L</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.00773em">R</span><span class="mord mathdefault mtight">G</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>。<br>在第二种设置中(ensembles, test),我们将RoBERTa提交给GLUE排行榜,并在9个任务中的4个取得了最先进的结果,并获得了迄今为止最高的平均分。这是特别令人兴奋的,因为RoBERTa不依赖于多任务微调,不像大多数其他结果的提交。我们期望未来的工作可以通过加入更复杂的多任务微调程序来进一步改进这些结果。</p><h3 id="52-在-squad上的结果"><a class="markdownIt-Anchor" href="#52-在-squad上的结果"></a> 5.2 在 SQuAD上的结果</h3><p>在SQuAD上,我们采用了比以往更简单的方法。尽管BERT (Devlin等人,2019年)和XLNet (Yang等人,2019年)都使用额外的QA数据集来扩充他们的训练数据,但我们只使用提供的SQuAD训练数据对RoBERTa进行微调。Yang等人(2019)也采用了自定义的分层学习率微调XLNet,而我们对所有层使用相同的学习率。<br>对于SQuAD 1.1,我们遵循与Devlin等人(2019)相同的微调程序。对于SQuAD v2.0,我们对给定的问题是否可回答进行了分类;我们通过对分类项和跨度损失项求和的方法,将该分类器与跨度预测器联合训练。</p><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h57jprld9mj20ef09jmxz.jpg" srcset="/img/loading.gif" lazyload alt="image-20220815164723912"></p><blockquote><p>表6:SQuAD的结果。†表明结果依赖于额外的外部训练数据。RoBERTa在开发和测试设置中只使用提供的SQuAD数据。<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mi>E</mi><mi>R</mi><msub><mi>T</mi><mrow><mi>L</mi><mi>A</mi><mi>R</mi><mi>G</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">BERT_{LARGE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.05017em">B</span><span class="mord mathdefault" style="margin-right:.05764em">E</span><span class="mord mathdefault" style="margin-right:.00773em">R</span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">L</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.00773em">R</span><span class="mord mathdefault mtight">G</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mi>L</mi><mi>N</mi><mi>e</mi><msub><mi>t</mi><mrow><mi>L</mi><mi>A</mi><mi>R</mi><mi>G</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">XLNet_{LARGE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.07847em">X</span><span class="mord mathdefault">L</span><span class="mord mathdefault" style="margin-right:.10903em">N</span><span class="mord mathdefault">e</span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">L</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.00773em">R</span><span class="mord mathdefault mtight">G</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>的结果分别来自Devlin等人(2019)和Yang等人(2019)。</p></blockquote><p>表6展示了我们的结果。在SQuAD v1.1中,RoBERTa与XLNet最先进的开发集相匹配。在SQuAD 2.0版本的开发套件中,RoBERTa设置了全新方法,比XLNet提高了0.4分(EM)和0.6分(F1)。<br>我们还将RoBERTa提交到公开的SQuAD 2.0排行榜,并评估它与其他系统的性能。大多数顶级系统都建立在BERT (Devlin等人,2019年)或XLNet (Yang等人,2019年)的基础上,这些系统都依赖于额外的外部训练数据。相比之下,我们的提交没有使用任何额外的数据。<br>除了一个模型,RoBERTa模型比其他提交的模型都要好。同时,RoBERTa是那些不依赖于数据增强的系统中得分最高的系统。</p><h3 id="53-在race上的结果"><a class="markdownIt-Anchor" href="#53-在race上的结果"></a> 5.3 在RACE上的结果</h3><p>在RACE中,系统提供了一段文本、一个相关的问题和四个候选答案。系统需要对四个候选答案中哪个是正确的进行分类。<br>为了完成这个任务,我们修改RoBERTa,将每个候选答案与相应的问题和文章连接起来。然后,我们对这四个序列进行编码,并通过一个全连接层传递得到的[CLS]表示,该层用于预测正确答案。我们截断长于128个token的问题-答案对,如果需要还会截断通道,这样总长度最多不超过512个token。</p><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h57jivuimbj20ef05ujrp.jpg" srcset="/img/loading.gif" lazyload alt="image-20220815164046771"></p><blockquote><p>表7:RACE测试集的结果。<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>B</mi><mi>E</mi><mi>R</mi><msub><mi>T</mi><mrow><mi>L</mi><mi>A</mi><mi>R</mi><mi>G</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">BERT_{LARGE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.05017em">B</span><span class="mord mathdefault" style="margin-right:.05764em">E</span><span class="mord mathdefault" style="margin-right:.00773em">R</span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">L</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.00773em">R</span><span class="mord mathdefault mtight">G</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mi>L</mi><mi>N</mi><mi>e</mi><msub><mi>t</mi><mrow><mi>L</mi><mi>A</mi><mi>R</mi><mi>G</mi><mi>E</mi></mrow></msub></mrow><annotation encoding="application/x-tex">XLNet_{LARGE}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord mathdefault" style="margin-right:.07847em">X</span><span class="mord mathdefault">L</span><span class="mord mathdefault" style="margin-right:.10903em">N</span><span class="mord mathdefault">e</span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">L</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:.00773em">R</span><span class="mord mathdefault mtight">G</span><span class="mord mathdefault mtight" style="margin-right:.05764em">E</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>的结果来自Yang等人(2019)。</p></blockquote><p>RACE测试集的结果如表7所示。RoBERTa在中等和高级设置中都是最高得分。</p><h2 id="6-相关工作"><a class="markdownIt-Anchor" href="#6-相关工作"></a> 6 相关工作</h2><p>预训练方法设计有不同的训练目标,包括语言建模(Dai 和 Le,2015;Peters 等,2018;Howard 和 Ruder,2018)、机器翻译(McCann 等,2017)和掩码语言建模(Devlin et al., 2019;Lample and Conneau, 2019)。最近的许多论文都对每个最终任务使用了微调模型的基本方法(Howard and Ruder, 2018;Radford et al., 2018),以及使用一些变体的预训练掩码语言模型。然而,较新的方法通过多任务微调(Dong 等人,2019 年)、结合实体嵌入(Sun 等人,2019 年)、跨度预测(Joshi 等人,2019 年)、和自回归预训练的多种变体(Song 等人,2019 年;Chan 等人,2019 年;Yang 等人,2019 年)。通过训练更大的模型和更多的数据,性能通常也会得到提高(Devlin 等人,2019 年;Baevski et al., 2019; Yang et al., 2019;Radford et al., 2019)。我们的目标是复制、简化和更好地调整BERT 的训练,作为更好地了解所有这些方法的相对性能的参考点。</p><h2 id="7-结论"><a class="markdownIt-Anchor" href="#7-结论"></a> 7 结论</h2><p>在预训练BERT模型时,我们评估了许多设计决策。结果发现通过对模型进行更长的训练,在更多的数据上使用更大的批处理,可以大大提高性能,同时去掉了下一句预测目标,使用长序列训练,增加动态改变掩码模式。我们改进的预训练模型,称之为RoBERTa,在GLUE、RACE和SQuAD上实现了非常不错的结果,并且不需要对GLUE进行多任务优化,不需要对SQuAD进行额外的数据训练。这些结果说明了以前被忽视了的设计决策的重要性,并表明BERT的预训练目标与最近提出的替代方案相比仍然具有竞争力。</p><p>此外,我们还使用了一个新的数据集CC-NEWS,并在下地址发布了用于预训练和微调的模型和代码:<a href="https://github.com/pytorch/fairseq" target="_blank" rel="noopener">https://github.com/pytorch/fairseq</a>.</p>]]></content>
<categories>
<category>自然语言处理</category>
</categories>
<tags>
<tag>NLP</tag>
</tags>
</entry>
<entry>
<title>BERT之后,NLP主要预训练模型演变梳理</title>
<link href="/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/NLP/BERT%E4%B9%8B%E5%90%8E%EF%BC%8CNLP%E4%B8%BB%E8%A6%81%E9%A2%84%E8%AE%AD%E7%BB%83%E6%A8%A1%E5%9E%8B%E6%BC%94%E5%8F%98%E6%A2%B3%E7%90%86/"/>
<url>/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/NLP/BERT%E4%B9%8B%E5%90%8E%EF%BC%8CNLP%E4%B8%BB%E8%A6%81%E9%A2%84%E8%AE%AD%E7%BB%83%E6%A8%A1%E5%9E%8B%E6%BC%94%E5%8F%98%E6%A2%B3%E7%90%86/</url>
<content type="html"><是由 Google AI 于 2018 年 10 月提出的一种基于深度学习的语言表示模型。BERT 发布时,在 11 种不同的自然语言处理(NLP)测试任务中取得最佳效果。</p><p>截至2022年6月,很多研究者又基于BERT提出了很多新的模型,本文旨在梳理基于BERT模型优化后部分预训练模型,以便读者能够更快掌握BERT相关内容,为后期工作中使用BERT相关模型提供便捷性。</p><h2 id="2bert基本介绍"><a class="markdownIt-Anchor" href="#2bert基本介绍"></a> 2.BERT基本介绍</h2><p>BERT 主要的模型结构是 Transformer 的编码器部分。Transformer[2] 是由 Ashish 等于 2017年提出的,用于Google机器翻译,包含编码器(Encoder)和解码器(Decoder) 两部分。其中 BERT-base 与 BERT-large 模型分别采用了 12 层与 24 层的 Transformer 编码器作为模型网络层。相比于传统用于 NLP 任务的循环神经网络 (RNN)及长短时记忆网络(LSTM)等,Transformer 拥有更强大的文本编码能力,也能更高效地利用 GPU 等高性能设备完成大规模训练工作。</p><p>基于 BERT 模型的自然语言处理任务通过两个过程来实现:</p><ul><li>在预训练的过程中,首先利用大规模没有标注过的文本语料,例如百科知识、网页新闻等,通过充分的自监督训练,有效学习文本的语言特征,得到深层次的文本向量表示,形成相应文本的预训练模型。</li><li>在微调过程中,直接将预训练过程中完成收敛的网络参数(即嵌入层和网络层)作为起始模型,根据具体的下游任务(如分类、序列标注等),输入人工标注好的数据集,完成模型的进一步拟合与收敛。从而得到一个可用的深度学习模型来实现特定的自然语言处理任务,例如文本分类、序列标注等。</li></ul><p>自 BERT 发布以来,基于“预训练-微调”的两阶段方法逐渐成为自然语言处理研究的主流。</p><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h3fvn5eaajj20rn0b4761.jpg" srcset="/img/loading.gif" lazyload alt="image-20220621150352751"></p><blockquote><p>图片来源:参考文献[1]</p></blockquote><h2 id="3ernie"><a class="markdownIt-Anchor" href="#3ernie"></a> 3.ERNIE</h2><p>ERNIE[3](Enhanced Representation through Knowledge Integration)是百度(清华几乎在同一时间[2019]也发布了ERNIE版本,不过现在社会上谈起ERNIE,大多指百度版ERNIE)在2019年4月基于BERT模型做的进一步优化,在中文的NLP任务上得到了state-of-the-art的结果。其主要是通过对知识进行整合,达到增强表达的目的。受BERT的掩码策略启发,ERNIE旨在学习由知识掩码策略增强的语言表征,其中包括实体级掩码和短语级掩码。实体级策略通常由多个单词组成的实体。短语级策略将由多个单词组成的整个短语作为一个概念单元进行屏蔽。</p><p>ERNIE和BERT的区别:<br><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h3fvzus0t0j20pw0df75d.jpg" srcset="/img/loading.gif" lazyload alt="image-20220621151607598"></p><blockquote><p>图片来源:参考文献[3]</p></blockquote><p>在使用先验知识来增强预训练语言模型时ERNIE并没有直接添加知识嵌入,而是使用了一种多阶段知识掩码策略,将短语和实体集成到语言表示中。句子中不同的掩码级别如下图:<br><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h3fw2my1gaj20r703xdgs.jpg" srcset="/img/loading.gif" lazyload alt="image-20220621151848304"></p><blockquote><p>图片来源:参考文献[3]</p></blockquote><ul><li><p>基本级别的掩码</p><ul><li>第一个学习阶段是使用基本的掩码,它将一个句子视为一系列基本的语言单元,对于英语,基本的语言单元是单词,对于汉语,基本的语言单元是汉字。在训练过程中,我们随机屏蔽15%的基本语言单元,并使用句子中的其他基本单元作为输入,并训练一个转换器来预测被屏蔽的单元。基于基本层掩码,我们可以得到基本的单词表示。因为它是在基本语义单元随机掩码的基础上训练的,所以高层语义的知识表示很难完全建模。</li></ul></li><li><p>短语级别的掩码</p><ul><li>第二阶段是使用短语级掩码。短语是作为概念单位的一小群单词或字符。对于英语,我们使用词汇分析和组块工具来获取句子中短语的边界,并使用一些依赖于语言的切分工具来获取其他语言(如汉语)中的单词/短语信息。在短语级掩码阶段,我们还使用基本语言单元作为训练输入,不像随机基本单元掩码那样,这次我们在句子中多选几个短语,掩码并预测同一短语中的所有基本单元。在这个阶段,短语信息被编码到单词嵌入中。</li></ul></li><li><p>实体级别的掩码</p><ul><li>第三阶段是实体级掩码。我们把一些专有名词,如地点、人名、组织、产品等抽象为实体进行屏蔽。实体通常包含句子中的重要信息。在短语屏蔽阶段,我们首先分析一个句子中的命名实体,然后屏蔽和预测实体中所有的空缺。</li></ul></li></ul><p>经过这三个阶段的学习,我们可以获得语义信息丰富的表达。</p><p>经过实验结果表明,在五个自然语言处理任务(包括自然语言推理,语义相似性,命名实体识别,情感分析和检索问答)上,ERNIE优于当时其他基准方法。此外ERNIE在完形填空测试中具有更强大的知识推理能力。</p><h2 id="4roberta"><a class="markdownIt-Anchor" href="#4roberta"></a> 4.RoBERTa</h2><p>RoBERTa[4]是Facebook和华盛顿大学于2019年7月在论文《RoBERTa: A Robustly Optimized BERT Pretraining Approach》中提出的。文章在 BERT模型的基础上提出了 BERT 模型的改进版 RoBERTa,使其获得了更好的自然语言任务处理效果,并在 GLUE,SQuAD,RACE 三个榜上取得最好的SOTA。</p><p>RoBERTa主要在<strong>三方面</strong>对之前提出的BERT做了改进:</p><ul><li><strong>其一</strong>是模型的具体细节层面,改进了优化函数;</li><li><strong>其二</strong>是训练策略层面,改用了动态掩码的方式训练模型,证明了NSP(Next Sentence Prediction)训练策略的不足,采用了更大的batch size;</li><li><strong>其三</strong>是数据层面,一方面使用了更大的数据集,另一方面是使用字节级别的BPE(Bytes-level BEP )来处理文本数据。</li></ul><h2 id="5deberta"><a class="markdownIt-Anchor" href="#5deberta"></a> 5.DeBERTa</h2><p>DeBERTa[5](Decoding-enhanced BERT with Disentangled Attention)是微软发表于ICLR2021上的预训练语言模型。2021年1月DeBERTa在SuperGLUE这项自然语言理解基准任务上**「超越人类」**,以90.3分夺冠。</p><p>DeBERTa从两方面改进了BERT预训练的方法:</p><ul><li>自注意力**「解耦」**机制<ul><li>用2个向量分别表示content 和 position,即word本身的文本内容和位置。word之间的注意力权重则使用word内容之间和位置之间的解耦矩阵。这是因为word之间的注意力不仅取决于其文本内容,还依赖于两者的相对位置。</li></ul></li></ul><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h3fywvod1fj20vq0a076l.jpg" srcset="/img/loading.gif" lazyload alt="image-20220621165704274"></p><blockquote><p>图片来源:参考文献[6]</p></blockquote><ul><li>用Enhanced Mask Decoder(<strong>「EMD」</strong>)强化预训练输出层<ul><li>原始的BERT存在预训练和微调不一致问题。预训练阶段,隐层最终的输出输入到softmax预测被mask掉的token,而微调阶段则是将隐层最终输出输入到特定任务的decoder。这个decoder根据具体任务不同可能是一个或多个特定的decoder,如果输出是概率,那么还需要加上一个softmax层。为消除这种不一致性,DeBERTa将MLM与其他下游任务同等对待,并将原始BERT中输出层的softmax替换为**「增强后的mask decoder(EMD)」**,EMD包含一个或多个Transformer层和一个softmax输出层。至此,结合了BERT和EMD的DeBERTa成为了一个encoder-decoder模型。</li></ul></li></ul><p>使用这两种技术,新的预训练语言模型DeBERTa在许多下游NLP任务上的表现都优于RoBERTa和BERT。DeBERTa这项工作展示了探索自注意的词表征解耦以及使用任务特定解码器改进预训练语言模型的潜力。</p><h2 id="6综述"><a class="markdownIt-Anchor" href="#6综述"></a> 6.综述</h2><p>本文针对BERT系列部分典型模型进行梳理,希望为大家梳理出在BERT提出后,整体的优化脉络。同时基于BERT的优化方向可以总结为如下:</p><ul><li><p>首先,大量的研究者通过对 BERT 的两个预训练目标进行改进提升模型对文本特征的学习能力,如:ERNIE、RoBERTa、DeBERTa等。对于预训练目标的优化改进是最常见同时也是效果最好的改造方式,所以本文在前面介绍中,也主要梳理了该方向的主要模型。</p></li><li><p>其次,针对特定领域的显性知识,研究者提出在预训练模型中融合外部知识的方法,进一步丰富了模型所学习的文本特征,如用于专利文本的 PatentBERT:。</p></li></ul><p>这两种路线提升了模型的特征学习能力,但是并没有对预训练模型内部结构进行实质性的改进。</p><ul><li><p>部分研究者从 Transformer 神经网络出发,对其内部结构进行了改进,从而扩展了模型的应用场景,如:BART。</p></li><li><p>最后,针对 BERT 模型参数量过大导致普通的硬件设备无法有效训练和加载的问题,大量的研究者提出模型压缩的方法,进而提升了 BERT 模型的易用性,如:ALBERT。</p></li></ul><h2 id="7参考资料"><a class="markdownIt-Anchor" href="#7参考资料"></a> 7.参考资料</h2><p>bert [1] <a href="https://arxiv.org/pdf/1810.04805.pdf" target="_blank" rel="noopener">https://arxiv.org/pdf/1810.04805.pdf</a></p><p>transformer[2] <a href="https://arxiv.org/pdf/1706.03762.pdf" target="_blank" rel="noopener">https://arxiv.org/pdf/1706.03762.pdf</a></p><p>ernie [3] <a href="https://arxiv.org/pdf/1904.09223.pdf" target="_blank" rel="noopener">https://arxiv.org/pdf/1904.09223.pdf</a></p><p>roberta [4] <a href="https://arxiv.org/pdf/1907.11692.pdf" target="_blank" rel="noopener">https://arxiv.org/pdf/1907.11692.pdf</a></p><p>deberta[5] <a href="https://arxiv.org/pdf/2006.03654.pdf" target="_blank" rel="noopener">https://arxiv.org/pdf/2006.03654.pdf</a></p><p>deberta[6] <a href="https://www.microsoft.com/en-us/research/blog/microsoft-deberta-surpasses-human-performance-on-the-superglue-benchmark/?lang=fr_ca" target="_blank" rel="noopener">https://www.microsoft.com/en-us/research/blog/microsoft-deberta-surpasses-human-performance-on-the-superglue-benchmark/?lang=fr_ca</a></p><hr><hr><h2 id="附件"><a class="markdownIt-Anchor" href="#附件"></a> 附件</h2><p>BERT模型优化改进路线总结:</p><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h3fzovky2hj20mr13pjwp.jpg" srcset="/img/loading.gif" lazyload alt="image-20220621172319969"></p>]]></content>
<categories>
<category>自然语言处理</category>
</categories>
<tags>
<tag>NLP</tag>
</tags>
</entry>
<entry>
<title>Flask中 jsonify有什么作用?如何使用?</title>
<link href="/python/python/Flask%E4%B8%AD%20jsonify%E6%9C%89%E4%BB%80%E4%B9%88%E4%BD%9C%E7%94%A8%EF%BC%9F%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%EF%BC%9F/"/>
<url>/python/python/Flask%E4%B8%AD%20jsonify%E6%9C%89%E4%BB%80%E4%B9%88%E4%BD%9C%E7%94%A8%EF%BC%9F%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%EF%BC%9F/</url>
<content type="html"><![CDATA[<h1 id="flask中-jsonify有什么作用如何使用"><a class="markdownIt-Anchor" href="#flask中-jsonify有什么作用如何使用"></a> Flask中 jsonify有什么作用?如何使用?</h1><p><code>jsonify</code>是Flask框架提供的一个函数,用于将Python对象转换为JSON格式的响应。它将Python对象转换为JSON格式的字符串,并将其作为HTTP响应的主体返回给客户端,同时设置正确的Content-Type响应头,表明响应主体是JSON格式的数据。</p><p><code>jsonify</code>函数的主要作用是简化Flask应用程序中返回JSON响应的过程。在Flask应用程序中,返回JSON响应通常需要将Python对象手动序列化为JSON格式的字符串,然后将其封装到Flask的<code>Response</code>对象中。而使用<code>jsonify</code>函数可以简化这个过程,使得代码更加简洁、易读。以下是一个示例代码:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><code class="hljs python">pythonCopy code<br><span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> Flask, jsonify<br><br>app = Flask(__name__)<br><br><span class="hljs-meta">@app.route('/users')</span><br><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_users</span><span class="hljs-params">()</span>:</span><br> users = [<br> {<span class="hljs-string">"name"</span>: <span class="hljs-string">"Alice"</span>, <span class="hljs-string">"age"</span>: <span class="hljs-number">30</span>},<br> {<span class="hljs-string">"name"</span>: <span class="hljs-string">"Bob"</span>, <span class="hljs-string">"age"</span>: <span class="hljs-number">25</span>},<br> {<span class="hljs-string">"name"</span>: <span class="hljs-string">"Charlie"</span>, <span class="hljs-string">"age"</span>: <span class="hljs-number">35</span>}<br> ]<br> <span class="hljs-keyword">return</span> jsonify(users) <span class="hljs-comment"># 将Python对象转换为JSON格式的响应</span><br><br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">'__main__'</span>:<br> app.run()<br></code></pre></td></tr></table></figure><p>在上面的代码中,当客户端访问<code>/users</code>时,<code>get_users</code>函数将返回一个Python列表<code>users</code>,其中包含三个字典对象。使用<code>jsonify</code>函数可以将这个列表转换为JSON格式的响应,并将其作为HTTP响应返回给客户端。客户端收到响应后,可以使用JSON解析器将响应主体解析为JSON对象,从而获取每个用户的详细信息。</p><p>需要注意的是,使用<code>jsonify</code>函数需要先安装Flask框架。另外,<code>jsonify</code>函数使用的是Python内置的<code>json</code>模块进行序列化操作,因此需要确保序列化的对象是支持JSON序列化的类型。</p>]]></content>
<categories>
<category>python</category>
</categories>
<tags>
<tag>python</tag>
</tags>
</entry>
<entry>
<title>AI模型部署-fastapi[3-3]</title>
<link href="/AI%E7%BB%BC%E5%90%88/AI%E7%BB%BC%E5%90%88/AI%E6%A8%A1%E5%9E%8B%E9%83%A8%E7%BD%B2-fastapi%5B3-3%5D/"/>
<url>/AI%E7%BB%BC%E5%90%88/AI%E7%BB%BC%E5%90%88/AI%E6%A8%A1%E5%9E%8B%E9%83%A8%E7%BD%B2-fastapi%5B3-3%5D/</url>
<content type="html"><![CDATA[<h2 id="一-使用方法"><a class="markdownIt-Anchor" href="#一-使用方法"></a> 一、使用方法</h2><ul><li>1.fastapi服务代码</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># A机器中某路径下,app.py</span><br><br><span class="hljs-comment"># fastapi模块导入</span><br><span class="hljs-keyword">from</span> fastapi <span class="hljs-keyword">import</span> FastAPI<br><span class="hljs-keyword">from</span> pydantic <span class="hljs-keyword">import</span> BaseModel<br><br><br><span class="hljs-comment"># 通过item类定义数据类型</span><br><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Item</span><span class="hljs-params">(BaseModel)</span>:</span><br> data: dict<br><br><br>app = FaseAPI()<br><br><br><span class="hljs-meta">@app.post("/v1/")</span><br><span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">creat_item</span><span class="hljs-params">(item: Item)</span>:</span><br> <span class="hljs-keyword">return</span> item.data[<span class="hljs-string">"text"</span>]<br></code></pre></td></tr></table></figure><ul><li>2.fastapi服务部署</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs shell"><span class="hljs-meta">#</span><span class="bash"> A机器中终端执行</span><br><br><span class="hljs-meta">#</span><span class="bash"> 服务调试</span><br>uvicorn app:app --reload --host 0.0.0.0 --port 8001<br><br><span class="hljs-meta">#</span><span class="bash"> 服务部署</span><br>nohup uvicorn app:app --host 0.0.0.0 --port 8001 > ./ret.log 2>&1 &<br><span class="hljs-meta">#</span><span class="bash"> nohup <span class="hljs-built_in">command</span> & -- 在后台运行</span><br></code></pre></td></tr></table></figure><ul><li>3.部署好的服务请求</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># B机器中某路径下,test.py</span><br><span class="hljs-comment"># 也可在同一台机器中测试</span><br><br><span class="hljs-comment"># coding=utf-8</span><br><br><span class="hljs-keyword">import</span> requests <br><span class="hljs-keyword">import</span> json<br><span class="hljs-keyword">import</span> time<br><br>url = <span class="hljs-string">"http://0.0.0.0:8001/v1/"</span><br><br>data = {<br> <span class="hljs-string">"id"</span>: <span class="hljs-number">1234</span>,<br> <span class="hljs-string">"data"</span>: <span class="hljs-string">"这是一条测试数据!"</span><br>}<br><br>start = time.time()<br>res = requests.post(url, json=data, timeout=<span class="hljs-number">200</span>)<br>end = time.time()<br><br>print(<span class="hljs-string">"耗费时间:"</span>, end - start)<br>print(<span class="hljs-string">"返回的结果:"</span>, res.json())<br></code></pre></td></tr></table></figure><h2 id="二-总结"><a class="markdownIt-Anchor" href="#二-总结"></a> 二、总结</h2><p>如果使用fastapi框架部署深度学习模型</p><ul><li>1.在A机器中书写fastapi服务代码</li><li>2.在A机器终端部署写好的服务</li><li>3.在B机器调用部署好的服务</li></ul>]]></content>
<categories>
<category>AI综合</category>
</categories>
<tags>
<tag>AI</tag>
</tags>
</entry>
<entry>
<title>AI模型部署-flask[3-2]</title>
<link href="/AI%E7%BB%BC%E5%90%88/AI%E7%BB%BC%E5%90%88/AI%E6%A8%A1%E5%9E%8B%E9%83%A8%E7%BD%B2-flask%5B3-2%5D/"/>
<url>/AI%E7%BB%BC%E5%90%88/AI%E7%BB%BC%E5%90%88/AI%E6%A8%A1%E5%9E%8B%E9%83%A8%E7%BD%B2-flask%5B3-2%5D/</url>
<content type="html"><![CDATA[<h2 id="一-背景"><a class="markdownIt-Anchor" href="#一-背景"></a> 一、背景</h2><p>深度学习在训练好模型中,我们需要进行部署,有一些框架中已经自带部署框架,如TensorFlow中的 TensorFlow serving,paddlepaddle中的 paddle serving等。</p><p>但是有些框架自带部署能力并不友好,或者如pytorch类框架,直接官方就建议使用python的flask框架。</p><p>如果你在训练好模型后,想自己基于flask框架部署模型,下文就可以解决该类需求。</p><h2 id="二-使用方法"><a class="markdownIt-Anchor" href="#二-使用方法"></a> 二、使用方法</h2><ul><li>1.flask服务代码</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># A机器中某路径下,app.py</span><br><br><span class="hljs-comment"># 导入了 Flask 类。该类的实例将会成为我们的 WSGI 应用。</span><br><span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> Flask<br><span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> request<br><br><span class="hljs-comment"># 创建一个flask类的实例。</span><br>app = Flask(__name__)<br><span class="hljs-comment"># 第一个参数是应用模块或者包的名称。 __name__ 是一个适用于大多数情况的快捷方式。</span><br><span class="hljs-comment"># 有了这个参数, Flask才能知道在哪里可以找到模板和静态文件等东西。</span><br><br><br><span class="hljs-comment"># 定义服务请求路径和方式, 使用POST请求</span><br><span class="hljs-comment"># 使用 route() 装饰器来告诉 Flask 触发函数的URL 。</span><br><span class="hljs-meta">@app.route("/v1/", methods=["POST"])</span><br><span class="hljs-comment"># "/v1/" 表示请求服务路径</span><br><span class="hljs-comment"># "POST" 不同的请求方法, 常见的有 get,post</span><br><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">example</span><span class="hljs-params">()</span>:</span><br> <span class="hljs-string">"""flask模型预测"""</span><br> text = request.get_json()<br> <span class="hljs-comment"># 测试请求数据内容</span><br> <span class="hljs-comment"># print(text)</span><br> <span class="hljs-string">"""</span><br><span class="hljs-string"> 逻辑书写</span><br><span class="hljs-string"> """</span><br> <span class="hljs-keyword">return</span> text<br></code></pre></td></tr></table></figure><ul><li>2.flask服务部署</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs shell"><span class="hljs-meta">#</span><span class="bash"> A机器中终端执行</span><br><br><span class="hljs-meta">#</span><span class="bash"> 服务调试</span><br>gunicorn -w 1 -b 0.0.0.0:8001 app:app<br><span class="hljs-meta">#</span><span class="bash"> -w 代表开启的进程数, 我们只开启一个进程</span><br><span class="hljs-meta">#</span><span class="bash"> -b 服务的IP地址和端口</span><br><span class="hljs-meta">#</span><span class="bash"> app:app 是指执行的主要对象位置, 在app.py中的app对象</span><br><br><span class="hljs-meta">#</span><span class="bash"> 服务部署</span><br>nohup gunicorn -w 1 -b 0.0.0.0:8001 app:app > ./ret.log 2>&1 &<br><span class="hljs-meta">#</span><span class="bash"> nohup <span class="hljs-built_in">command</span> & -- 在后台运行</span><br></code></pre></td></tr></table></figure><ul><li>3.部署好的服务请求</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># B机器中某路径下,test.py</span><br><span class="hljs-comment"># 也可在同一台机器中测试</span><br><br><span class="hljs-comment"># coding=utf-8</span><br><br><span class="hljs-keyword">import</span> requests <br><span class="hljs-keyword">import</span> json<br><span class="hljs-keyword">import</span> time<br><br><br>url = <span class="hljs-string">"http://0.0.0.0:8001/v1/"</span><br><br>data = {<br> <span class="hljs-string">"id"</span>: <span class="hljs-number">1234</span>,<br> <span class="hljs-string">"data"</span>: <span class="hljs-string">"这是一条测试数据!"</span><br>}<br><br>start = time.time()<br>res = requests.post(url, json=data, timeout=<span class="hljs-number">200</span>)<br>end = time.time()<br><br>print(<span class="hljs-string">"耗费时间:"</span>, end - start)<br>print(<span class="hljs-string">"返回的结果:"</span>, res.json())<br></code></pre></td></tr></table></figure><h2 id="三-总结"><a class="markdownIt-Anchor" href="#三-总结"></a> 三、总结</h2><p>如果使用flask框架部署深度学习模型</p><ul><li>1.在A机器中书写flask服务代码</li><li>2.在A机器终端部署写好的服务</li><li>3.在B机器调用部署好的服务</li></ul>]]></content>
<categories>
<category>AI综合</category>
</categories>
<tags>
<tag>AI</tag>
</tags>
</entry>
<entry>
<title>AI模型部署-flask和fastapi对比[3-1]</title>
<link href="/AI%E7%BB%BC%E5%90%88/AI%E7%BB%BC%E5%90%88/AI%E6%A8%A1%E5%9E%8B%E9%83%A8%E7%BD%B2-flask%20%E5%92%8Cfastapi%20%E5%AF%B9%E6%AF%94%5B3-1%5D/"/>
<url>/AI%E7%BB%BC%E5%90%88/AI%E7%BB%BC%E5%90%88/AI%E6%A8%A1%E5%9E%8B%E9%83%A8%E7%BD%B2-flask%20%E5%92%8Cfastapi%20%E5%AF%B9%E6%AF%94%5B3-1%5D/</url>
<content type="html"><![CDATA[<h2 id="1基本介绍"><a class="markdownIt-Anchor" href="#1基本介绍"></a> 1.基本介绍</h2><p>flask、fastapi都是python语言在Web领域的框架,使用它们可以帮助我们提升效率,节省时间,避免我们在组装”汽车“的时候,还要从”轮子“、”螺丝钉“做起。</p><blockquote><p>python语言中,web领域主流框架有:django, flask, tornado, fastapi等</p><p>本文主要从AI中训练好的模型如何更便捷、高效的部署,所以着重介绍flask和fastapi.</p></blockquote><h3 id="11-flask是什么"><a class="markdownIt-Anchor" href="#11-flask是什么"></a> 1.1 flask是什么</h3><p>Flask 是一个用 Python 编写的轻量级 Web 应用框架。其被称为“微框架”,因为它使用简单的核心,通过扩展增加其他功能。如文件上传等。</p><p><a href="https://dormousehole.readthedocs.io/en/latest/" target="_blank" rel="noopener">官方网站</a></p><h3 id="12-fastapi是什么"><a class="markdownIt-Anchor" href="#12-fastapi是什么"></a> 1.2 fastapi是什么</h3><p>FastAPI是一个高性能Web框架,用于构建API。</p><p>FastAPI主要特性:</p><ul><li>快速:非常高的性能,与NodeJS和Go相当</li><li>快速编码:将功能开发速度提高约200%至300%</li><li>更少的错误:减少约40%的人为错误</li><li>直观:强大的编辑器支持,自动补全无处不在,调试时间更少</li><li>简易:旨在易于使用和学习,减少阅读文档的时间。</li><li>简短:减少代码重复。</li><li>稳健:获取可用于生产环境的代码,具有自动交互式文档</li><li>基于标准:基于并完全兼容 API 的开放标准OpenAPI和JSON Schema</li></ul><p>FastAPI要求:</p><ul><li><strong>Python 3.6+</strong></li></ul><p><a href="https://fastapi.tiangolo.com/zh/" target="_blank" rel="noopener">官方网站</a></p><h2 id="2两者对比"><a class="markdownIt-Anchor" href="#2两者对比"></a> 2.两者对比</h2><h3 id="21-flask优缺点"><a class="markdownIt-Anchor" href="#21-flask优缺点"></a> 2.1 flask优缺点</h3><ul><li><p>优点</p><ul><li>与其他 Web 应用程序框架不同,flask 让你可以完全控制 Web 开发,从而完全控制应用程序和 Web 开发。</li><li>Flask 允许进行单元测试,并且由于其内置的开发服务器,集成的支持等,因此可以通过对一些扩展进行调整来过渡到 Web 框架。</li><li>Flask 简单易用,非常适合初学者使用,为开发人员提供了更好地学习和理解它的空间。它还使开发人员可以毫不费力地快速创建应用程序。</li></ul></li><li><p>缺点</p><ul><li>Flask 的很多模块由第三方开发,容易引起安全漏洞。</li><li><strong>Flask 具有一个单一的来源,表示它将依次处理每个请求,因此,无论有多少个请求,它仍然会轮流处理它们,这会耗费更多时间。</strong></li></ul></li></ul><p>可以将 Flask 用于商业项目。它可以帮助你快速入门,**但是网站高负荷情况下效果不佳。**你可以快速实施 Flask 项目,例如:</p><ul><li>电子商务系统。</li><li>Facebook / Twitter机器人。</li><li>在线社交网络。</li><li>静态网站。</li></ul><p>如果你要做一些小型个人项目,比如聊天机器人,或者想实现产品的快速原型,或者喜欢自由的编写代码控制程序的流程,那么可以选择 Flask。</p><h3 id="22-fastapi优缺点"><a class="markdownIt-Anchor" href="#22-fastapi优缺点"></a> 2.2 FastApi优缺点</h3><ul><li>优点<ul><li>**自动类型检查。**这意味着更少的 Bug,即使在深度嵌套的 JSON 请求中,Fast API 也会验证开发人员的数据类型。</li><li>集众所长,站在巨人的肩膀上。FastAPI 建立在 JSON Schema(用于验证JSON数据结构的工具),OAuth 2.0(用于授权的行业标准协议)和**OpenAPI(这是可公开获得的应用程序编程接口)**之类的标准之上。</li><li>现代化。FastAPI 使使用称为 graphene-python 的 Python 库轻松构建 GraphQL API 。</li><li>**快速、高性能。**可以和 NodeJS 和 Go 相提并论。</li></ul></li><li>缺点<ul><li>由于 FastAPI 相对较新,因此与其他框架相比,社区较小,第三方的教程相对较少。</li></ul></li></ul><p>FastAPI 适用于构建高性能的 API,本身支持异步,<strong>如果要构建异步 API,可以优先选择 FastAPI。</strong></p><blockquote><p>作者写开发fastapi的缘由:<a href="https://zhuanlan.zhihu.com/p/111710808" target="_blank" rel="noopener">FastApi诞生的缘由</a></p></blockquote><h3 id="23-比较"><a class="markdownIt-Anchor" href="#23-比较"></a> 2.3 比较</h3><p>Stack Overflow 2021 开发人员调查最受欢迎的 Web 框架:<br><img src="https://tva1.sinaimg.cn/large/008i3skNly1gxfsx3hgwgj30wf0u077r.jpg" srcset="/img/loading.gif" lazyload alt="image-20211216172737373"></p><blockquote><p>来源:<a href="https://insights.stackoverflow.com/survey/2021/#section-most-loved-dreaded-and-wanted-web-frameworks" target="_blank" rel="noopener">https://insights.stackoverflow.com/survey/2021/#section-most-loved-dreaded-and-wanted-web-frameworks</a></p></blockquote><p>从社区,性能,灵活性,学习成本,稳定性进行比较。</p><ul><li>社区活跃程度。<ul><li>Flask框架因为搭建较早,且开发者使用较多,所以社区非常活跃;FastAPI 的社区目前还比较小,因为它相对较新。</li></ul></li><li>性能。<ul><li>在性能方面,FastAPI 是领跑者,因为它是面向速度的。</li></ul></li><li>灵活性。<ul><li>灵活性是开发人员非常重视的东西,FastAPI 在代码方面是非常灵活的,其不限制代码布局。</li></ul></li><li>学习成本。<ul><li>FastAPI < Flask</li></ul></li><li>稳定性<ul><li>Flask > api</li></ul></li></ul>]]></content>
<categories>
<category>AI综合</category>
</categories>
<tags>
<tag>AI</tag>
</tags>
</entry>
<entry>
<title>目前使用不错软件整理</title>
<link href="/apple%E7%94%9F%E6%80%81/apple%E7%94%9F%E6%80%81/%E7%9B%AE%E5%89%8D%E4%BD%BF%E7%94%A8%E4%B8%8D%E9%94%99%E8%BD%AF%E4%BB%B6%E6%95%B4%E7%90%86/"/>
<url>/apple%E7%94%9F%E6%80%81/apple%E7%94%9F%E6%80%81/%E7%9B%AE%E5%89%8D%E4%BD%BF%E7%94%A8%E4%B8%8D%E9%94%99%E8%BD%AF%E4%BB%B6%E6%95%B4%E7%90%86/</url>
<content type="html"><![CDATA[<h3 id="办公"><a class="markdownIt-Anchor" href="#办公"></a> 办公</h3><ul><li>滴答清单:计划管理</li><li>screenbrush:屏幕画笔、标记</li><li>pdf阅读器:pdf expert<ul><li>做笔记功能,生态能力(ipad做笔记,可以在其他端查看)</li></ul></li></ul><h3 id="图文笔记"><a class="markdownIt-Anchor" href="#图文笔记"></a> 图文笔记</h3><ul><li>sublime(替代mac文本文档)</li><li>typora(markdown书写)<ul><li>搭配ipic使用(截图上传到云端)</li></ul></li><li>onenote(学习类笔记)</li><li>有道云(写随笔、晨间日记的地方)</li><li>xmind(脑图制作)</li><li>agenda(带分类窗口和时间线的笔记记录平台)</li></ul><h3 id="图片"><a class="markdownIt-Anchor" href="#图片"></a> 图片</h3><ul><li>截图软件:snipaste, 截图效果一般,但是贴图功能非常强大</li></ul><h3 id="影音"><a class="markdownIt-Anchor" href="#影音"></a> 影音</h3><ul><li>视频录制:obs</li><li>视频剪辑:screenflow</li></ul><h3 id="系统"><a class="markdownIt-Anchor" href="#系统"></a> 系统</h3><ul><li>bartender:mac bar管理工具,让你的bar没有那么杂乱的软件</li><li>magnet:屏幕窗口管理:<ul><li>尤其适合多屏用户(分享自己的快捷键)</li></ul></li><li>MonitorControl<ul><li>一键调节外置显示器亮度及音量的软件</li></ul></li></ul><h3 id="网络"><a class="markdownIt-Anchor" href="#网络"></a> 网络</h3><ul><li>浏览器<ul><li>2023年02月02日 之前<ul><li>Safari(为了苹果生态使用)、chrome(当Safari无法发挥作用时使用)</li></ul></li><li>2023年04月02日 之后<ul><li>因为Safari支持不够友好,转换回Chrome。</li></ul></li></ul></li></ul><h3 id="学习"><a class="markdownIt-Anchor" href="#学习"></a> 学习</h3><ul><li>bob:非常好用的翻译软件,支持截图翻译、输入翻译、复制翻译<ul><li>强烈推荐通过 serect key 接入使用</li></ul></li></ul><hr><hr><figure class="highlight gcode"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs gcode">苹果生态<br>iCloud云盘<span class="hljs-comment">(存储必要文档)</span><br>阅读书籍(苹果生态阅读+笔记同步)<br></code></pre></td></tr></table></figure>]]></content>
<categories>
<category>apple生态</category>
</categories>
<tags>
<tag>software</tag>
</tags>
</entry>
<entry>
<title>流言猛如虎</title>
<link href="/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/%E6%B5%81%E8%A8%80%E7%8C%9B%E5%A6%82%E8%99%8E/"/>
<url>/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/%E6%B5%81%E8%A8%80%E7%8C%9B%E5%A6%82%E8%99%8E/</url>
<content type="html"><![CDATA[<p>最近发生的几件事情,作为一个旁观者,让我深刻体会到在信息爆炸的今天,流言的可怕性。暂且在此记录,同时告诫自己以后类似情况应对之法。</p><ul><li>1.本周四下午,突然传出北京市因为疫情原因,新闻发布会将会宣布北京进入静默管理3天。该消息一经流传,就在各大短视频平台迅速蔓延,然后大部分市民都加入了蔬菜等日常物资的抢购潮。但是没过多久,随着疫情新闻发布会的结束,并没有如大家所传需要进入静默期,而是严惩假消息传播的始作俑者。</li><li>2.最近在刷微信小视频或者抖音的时候,总可以发现北大韦神的日常,有他授课的、日常生活被别人拍摄的。其中有一条是几个教授花数月解不开的难题,被韦神几分钟解决。这个视频经过几天发酵后,最后韦东奕亲自澄清,并没有如此事情,只是流言。</li></ul><p>我们每个人都处在信息爆炸的今天,说不定你某个无意的举动,经过蝴蝶效应的发酵,就会把你推上风口浪尖。甚至在你受到别人关注的时候,即使很多和你并不相关的事情,都会被杜撰出来。</p><p>我们暂且不讨论那些杜撰此类消息的人们,为了博人眼球,无所不用其极。我们能做的是,在流言中如何让自己尽可能成为一名“智者”。</p><p>现在的我们,每天都会接受来自外界的很多信息,其传播之广、传播之快,远超常人想象,在这些未经证实的“消息”被推送到我们面前,我们需要做的是:</p><ul><li>1.不做任何消息都照单全收的“接收者”,需要加上自己的判断。</li><li>2.流言止于智者。</li></ul><blockquote><p>于2022年05月14日23:29:33家中</p></blockquote>]]></content>
<categories>
<category>程序人生</category>
</categories>
<tags>
<tag>随感</tag>
</tags>
</entry>
<entry>
<title>ERNIE论文导读和翻译</title>
<link href="/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/NLP/ERNIE%E8%AE%BA%E6%96%87%E5%AF%BC%E8%AF%BB%E5%92%8C%E7%BF%BB%E8%AF%91/"/>
<url>/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/NLP/ERNIE%E8%AE%BA%E6%96%87%E5%AF%BC%E8%AF%BB%E5%92%8C%E7%BF%BB%E8%AF%91/</url>
<content type="html"><![CDATA[<p>ERNIE: Enhanced Representation through Knowledge Integration文章脉络:</p><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h52xbxsxidj20rx0w60v5.jpg" srcset="/img/loading.gif" lazyload alt="image-20220811165040398"></p><h2 id="摘要"><a class="markdownIt-Anchor" href="#摘要"></a> 摘要</h2><p>我们提出了一种新的知识增强语言表征模型,称为ERNIE(Enhanced Representation through Knowledge Integration,主要是通过对知识进行整合,达到增强表达的目的)。受BERT(Devlin等人,2018)的掩码策略启发,ERNIE旨在学习由知识掩码策略增强的语言表征,其中包括实体级掩码和短语级掩码。实体级策略要求通常由多个单词组成的实体。短语级策略将由多个单词组成的整个短语作为一个概念单元进行屏蔽。最新实验结果表明,在五个自然语言处理任务(包括自然语言推理,语义相似性,命名实体识别,情感分析和检索问答)上,ERNIE优于其他基准方法。我们还证明了ERNIE在完形填空测试中具有更强大的知识推理能力。</p><h2 id="1简介"><a class="markdownIt-Anchor" href="#1简介"></a> 1.简介</h2><p>事实证明,语言表征预训练(Mikolovet等人,2013年;Devlin等人,2018年)对于改善许多自然语言处理任务(如命名实体识别、情感分析和问答)是有效的。其为了获得可靠的单词表示,设计了神经语言模型,学习单词共现,然后通过无监督学习获得单词嵌入。Word2Vec(Mikolov等人,2013)和Glove(Penningtonet等人,2014)中的方法将单词表示为向量,其中相似的单词具有相似的单词表示。这些单词表示为其他深度学习模型中的单词向量提供了初始化。最近,Cove(Mc Cann et al.,2017)、Elmo(Peters et al.,2018)、GPT(Radford et al.,2018)和BERT(Devlin et al.,2018)等许多工作通过不同的策略改进了单词表示,这项研究已经被证明对下游自然语言处理任务更有效。</p><p>这些研究中的绝大多数只是通过上下文预测缺失的单词,然后进行建模。这些作品没有考虑句子中的先验知识。例如,在”Harry Potter is a series of fantasy novels written by J. K. Rowling”这句话中,“Harry Potter”是一个名字和“J. K. Rowling”是作家。该模型不需要长上下文的帮助,而只要通过单词搭配就可以很容易地预测实体中的遗漏单词Harry Potter。但是,现存的模型无法根据Harry Potter与J. K. Rowling之间的关系预测Harry Potter。 很显然,如果模型学习了有关先验知识的更多信息,则该模型可以获得更可靠的语言表示。</p><p>本文提出了一种基于知识掩码策略的ERNIE(enhanced representation by knowledge Integration)模型,除基本掩码策略外,还采用了两种知识策略:短语级策略和实体级策略。我们把一个短语或一个实体作为一个单位,通常由几个词组成。在单词表征训练中,同一单元中的所有单词都被屏蔽,而不是只屏蔽一个单词或字符。这样,在训练过程中,短语和实体的先验知识被隐式学习。ERNIE没有直接添加知识嵌入,而是有效地学习了有关知识和较长语义依赖的信息,如实体之间的关系、实体的属性和事件的类型,以指导单词学习。这可以使模型具有更好的泛化性和适应性。</p><p>为了降低模型的训练成本,ERNIE对异构中文进行了预训练,然后将其应用于5个中文NLP任务。ERNIE对所有这些任务的最新结果进行了改进。在完形填空测试上实验表明,与其他强基线方法相比,ERNIE具有更好的知识边缘推理能力。</p><p>ERNIE的主要的贡献如下:</p><p>(1)我们引入了一种新的语言学习处理模型,该模型弱化了语言单位(如符号和实体),以便隐式地从这些单位学习句法和语义信息。</p><p>(2)ERNIE在各种汉语自然语言处理任务上的表现明显优于先前的最新方法。</p><p>(3)我们发布了ERNIE和预训练模型的代码,这些代码都可以在如下链接中找到:<a href="https://github.com/PaddlePaddle/ERNIE/tree/develop/ernie" target="_blank" rel="noopener">https://github.com/PaddlePaddle/ERNIE/tree/develop/ernie</a>.</p><h2 id="2相关工作"><a class="markdownIt-Anchor" href="#2相关工作"></a> 2.相关工作</h2><h3 id="21上下文无关表示"><a class="markdownIt-Anchor" href="#21上下文无关表示"></a> 2.1上下文无关表示</h3><p>词作为连续向量的表示有着悠久的历史。Bengio等人(2003年)提出了一种非常流行的用于估计神经网络语言模型(NNLM)的结构,其中主要包括:一个具有线性投影层和非线性隐层的前馈神经网络用于学习单词向量表示。</p><p>通过使用大量未标记数据预训练语言模型,然后学习通用语言表示是有效的。传统方法侧重于上下文无关的词语嵌入。例如,Word2Vec(Mikolovet等人,2013年)和Glove(Pennington等人,2014年)等方法将大量文本作为输入,并生成几百维的词向量。它们为词汇表中的每个单词生成一个单词嵌入表示。</p><h3 id="22上下文感知表示"><a class="markdownIt-Anchor" href="#22上下文感知表示"></a> 2.2上下文感知表示</h3><p>我们知道,一个词在上下文中可能有完全不同的含义。Skip-thought(Kiros et al,2015)提出了一种通用的分布式句子编码器的无监督学习方法。Cove(McCann et al.,2017)表明,和在各种常见NLP任务中仅使用无监督的单词和字符向量相比,添加这些上下文向量可以提高性能。ULMFit(Howard and Ruder,2018)提出了一种有效的迁移学习方法,可应用于NLP中的任何任务。ELMo(Peters et al.,2018)从不同的维度概括了传统的词语嵌入研究。他们建议从语言模型中提取上下文敏感特征。GPT(Radford et al.,2018)通过调整Transformer增强了上下文敏感嵌入。</p><p>BERT(Devlin et al.,2018)使用两种不同的跟踪任务进行语言建模。Bert随机地在句子中隐藏一定比例的单词,并学习预测那些隐藏的单词。此外,BERT还学习预测两个句子是否相邻。这项任务试图模拟传统语言模型无法捕捉到两个句子之间的关系。因此,这种特殊的预训练方法有助于BERT在各种关键NLP数据集(如GLUE(Wang et al.,2018)和SQUAD(Rajpurkar et al.,2016)等)上远超过其他技术。</p><p>其他一些研究人员试图根据这些模型添加更多信息。MT-DNN(Liu等人,2019年)将预训练学习和多任务学习相结合,以提高GLUE中多个不同任务的表现(Wang等人,2018年)。GPT-2(Radford et al.,2019)将任务信息添加到预训练过程中,并使其模型适应零样本任务。XLM(Lample and Conneau,2019)将语言嵌入到预训练过程中,在跨语言任务中取得了更好的效果。</p><h3 id="23-异构数据"><a class="markdownIt-Anchor" href="#23-异构数据"></a> 2.3 异构数据</h3><p>在非监督的异构数据上预训练语义编码器可以提高迁移学习性能。我们(Ceret al.,2018)采用了来自维基百科、网络新闻、网络QA页面和论坛的异构数据对句子编码。句子编码器(Yanget al.,2018)基于从Reddit对话中提取的查询-响应对数据的响应预测。XLM(Lample和Conneau,2019)将平行语料库引入了BERT,该语料库与掩码语言模型任务联合训练。通过transformer对异构数据进行预训练,XLM在无监督机器翻译任务和分类任务中表现出了优异的性能。</p><h2 id="3方法"><a class="markdownIt-Anchor" href="#3方法"></a> 3.方法</h2><p>本节介绍ERNIE及其详细实现。我们首先描述了模型的transformer编码器,然后在第3.2节介绍了知识集成方法。BERT和ERNIE之间的比较如图1所示.</p><p><img src="https://tva1.sinaimg.cn/large/008i3skNly1gwg3499iqqj310w0kgtb0.jpg" srcset="/img/loading.gif" lazyload alt="image-20211115200010609"></p><h3 id="31-transformer编码器"><a class="markdownIt-Anchor" href="#31-transformer编码器"></a> 3.1 transformer编码器</h3><p>ERNIE使用多层Transformer (Vaswani et al,2017)作为基本编码器,类似于之前的预训练模型,例如GPT,BERT和XLM。 Transformer 可以通过自注意力机制来捕获句子中每个标记的上下文信息,并生成一系列上下文embedding。</p><p>对于中文语料库,我们在CJK Unicode范围内的每个字符周围添加空格,并使用WordPiece(Wu等人,2016)标记中文句子。对于给定的token,其输入表示是通过对相应的token、部分和位置进行求和构造的。每个序列的第一个标记是特殊分类嵌入([CLS])。</p><h3 id="32-知识整合"><a class="markdownIt-Anchor" href="#32-知识整合"></a> 3.2 知识整合</h3><p>我们使用先验知识来增强预训练语言模型。我们没有直接添加知识嵌入,而是提出了一种多阶段知识掩码策略,将短语和实体集成到语言表示中。句子中不同的掩码级别如图2所示。</p><p><img src="https://tva1.sinaimg.cn/large/008i3skNly1gwg3b5dw3gj315i08gjtz.jpg" srcset="/img/loading.gif" lazyload alt="image-20211115200650471"></p><h4 id="321-基本级别的掩码"><a class="markdownIt-Anchor" href="#321-基本级别的掩码"></a> 3.2.1 基本级别的掩码</h4><p>第一个学习阶段是使用基本的掩码,它将一个句子视为一系列基本的语言单元,对于英语,基本的语言单元是单词,对于汉语,基本的语言单元是汉字。在训练过程中,我们随机屏蔽15%的基本语言单元,并使用句子中的其他基本单元作为输入,并训练一个转换器来预测被屏蔽的单元。基于基本层掩码,我们可以得到基本的单词表示。因为它是在基本语义单元随机掩码的基础上训练的,所以高层语义的知识表示很难完全建模。</p><h4 id="322-短语级别的掩码"><a class="markdownIt-Anchor" href="#322-短语级别的掩码"></a> 3.2.2 短语级别的掩码</h4><p>第二阶段是使用短语级掩码。短语是作为概念单位的一小群单词或字符。对于英语,我们使用词汇分析和组块工具来获取句子中短语的边界,并使用一些依赖于语言的切分工具来获取其他语言(如汉语)中的单词/短语信息。在短语级掩码阶段,我们还使用基本语言单元作为训练输入,不像随机基本单元掩码那样,这次我们在句子中多选几个短语,掩码并预测同一短语中的所有基本单元。在这个阶段,短语信息被编码到单词嵌入中。</p><h4 id="323-实体级别的掩码"><a class="markdownIt-Anchor" href="#323-实体级别的掩码"></a> 3.2.3 实体级别的掩码</h4><p>第三阶段是实体级掩码。我们把一些专有名词,如地点、人名、组织、产品等抽象为实体进行屏蔽。实体通常包含句子中的重要信息。在短语屏蔽阶段,我们首先分析一个句子中的命名实体,然后屏蔽和预测实体中所有的空缺。</p><p>经过这三个阶段的学习,我们可以获得语义信息丰富的表达。</p><h2 id="4-实验"><a class="markdownIt-Anchor" href="#4-实验"></a> 4 实验</h2><p>为了进行更好的比较,ERNIE选取的模型和BERT-base模型相同,也具有12个编码器层、768个隐藏单元和12个注意力头。</p><h3 id="41-异构语料库的预训练"><a class="markdownIt-Anchor" href="#41-异构语料库的预训练"></a> 4.1 异构语料库的预训练</h3><p>ERNIE采用异构语料库进行预训练。我们构建了混合语料库,包含中文维基百科、百度百科、百度新闻和百度贴吧。句子的数量分别为2100万、5100万、4700万、5400万。百度百科包含以正式语言编写的百科全书文章,这是语言建模的有力基础。百度新闻提供有关电影名称、演员姓名、足球队名称等的最新信息。百度贴吧是一个类似Reddits的开放式论坛,每个帖子都可以被视为一个对话话题。在我们的DLM任务中我们使用了Tieba语料库,我们将在后面讨论这部分内容。</p><p>我们对汉字进行繁体到简体的转换,对英文字母进行大小写转换。为模型使用了17,964个unicode字符的共享词汇表。</p><h3 id="42-对话语言模型"><a class="markdownIt-Anchor" href="#42-对话语言模型"></a> 4.2 对话语言模型</h3><p>对话数据对于语义表示很重要,因为相同回复的相应查询语义通常相似。ERNIE在DLM(对话语言模型)任务上对查询-响应对话结构进行建模。如图3所示,我们的方法引入了对话嵌入(dialogue embedding)来识别对话中的角色,这与通用句子编码器的方法不同(Cer等人,2018)。 ERNIE的“对话”嵌入功能与BERT中的token类型嵌入功能相同,不同之处在于ERNIE还可以表示多回合对话(例如QRQ,QRR,QQR,其中Q和R分别代表“查询”和“响应”)。像BERT中的MLM一样,使用掩码来强制使模型预测以查询和响应为条件的缺失词。而且,我们通过用随机选择的句子替换查询或响应来生成假样本。该模型旨在判断多回合对话是真实的还是假的。</p><p><img src="https://tva1.sinaimg.cn/large/008i3skNly1gwg49bd7svj316s0guwhj.jpg" srcset="/img/loading.gif" lazyload alt="image-20211115203940210"></p><p>DLM任务帮助ERNIE学习对话中的隐式关系,这也增强了模型学习的语义表示能力。DLM任务的模型体系结构与MLM任务的模型体系结构兼容,因此它是与MLM任务交替训练的。</p><h3 id="43-ernie在中文自然语言处理任务中的实验"><a class="markdownIt-Anchor" href="#43-ernie在中文自然语言处理任务中的实验"></a> 4.3 ERNIE在中文自然语言处理任务中的实验</h3><p>ERNIE被用于在自然语言推理、语义相似性判断、命名实体识别、情感分析和问答等5项中文NLP任务上进行实验。</p><h4 id="431-自然语言推理"><a class="markdownIt-Anchor" href="#431-自然语言推理"></a> 4.3.1 自然语言推理</h4><p>跨语言自然语言推理(XNLI)语料库(Liu等人,2019年)是MultiNLI语料库的众包集合。这些标签用文本蕴涵进行注释,并翻译成包括中文在内的14种语言。标签包含矛盾、中性和修饰。我们遵循BERT中的中文实验(Devlin等人,2018年)。</p><h4 id="432-语义相似性"><a class="markdownIt-Anchor" href="#432-语义相似性"></a> 4.3.2 语义相似性</h4><p>大规模中文问题匹配语料库(LCQMC)(Liu等人,2018)旨在识别两个句子是否具有相同的意图。 数据集中的每一对句子都与一个二进制标签相关联,该二进制标签指示两个句子是否共享相同的意图,并且可以将该任务形式化为预测二进制标签。</p><h4 id="433-命名实时识别"><a class="markdownIt-Anchor" href="#433-命名实时识别"></a> 4.3.3 命名实时识别</h4><p>MSRA-NER数据集是为姓名识别而设计的,该数据集由Microsoft Research Asia发布。实体包含七种类型,包括人名、地名或组织名称等。此任务可视为序列标记任务。</p><h4 id="434-情感分析"><a class="markdownIt-Anchor" href="#434-情感分析"></a> 4.3.4 情感分析</h4><p>CHNSTINCorp(Song bo)是一个旨在判断句子情感的数据集。它包含了一些领域的评论,如酒店、书籍和电子计算机。这项任务的目的是判断句子是积极的还是消极的。</p><h4 id="435-检索问答"><a class="markdownIt-Anchor" href="#435-检索问答"></a> 4.3.5 检索问答</h4><p>NLPCC-DBQA数据集的目标(<a href="http://tcci.ccf.org.cn/conference/2016/dldoc/evagline2.pdf" target="_blank" rel="noopener">http://tcci.ccf.org.cn/conference/2016/dldoc/evagline2.pdf</a>)选择相应问题的答案。该数据集的评估方法包括MRR(Voorhees,2001)和F1分数。</p><h3 id="44-实验结果"><a class="markdownIt-Anchor" href="#44-实验结果"></a> 4.4 实验结果</h3><p>表1给出了5个中文NLP任务的测试结果。可以看出,ERNIE在所有任务上的表现都超过了BERT,在这些NLP任务上创造了最先进的结果。对于XNLI、MSRA-NER、CHNSTINCorp和nlpcc-dbqa(nlpcc:基于知识库的问答,dbqa:基于文档的问答)任务,ERNIE比BERT获得超过1%的绝对精度改进。<strong>ERNIE的成功归因于其知识整合策略。</strong></p><p><img src="https://tva1.sinaimg.cn/large/008i3skNly1gwh82ifv57j30zc0d4q54.jpg" srcset="/img/loading.gif" lazyload alt="image-20211116193703432"></p><h3 id="45-消融研究"><a class="markdownIt-Anchor" href="#45-消融研究"></a> 4.5 消融研究</h3><p>为了更好地了解ERNIE,我们将在本节中对ERNIE的每种策略进行消融实验。</p><h4 id="451-知识掩码策略的效果"><a class="markdownIt-Anchor" href="#451-知识掩码策略的效果"></a> 4.5.1 知识掩码策略的效果</h4><p>我们从整个语料库中抽取10%的训练数据,以验证知识掩码策略的有效性。结果见表2。我们可以看到,将短语级掩码添加到基线单词级掩码可以提高模型的性能。在此基础上,增加了实体级掩码策略,进一步提高了模型的性能。此外结果还表明,当预训练数据集的大小增加10倍时,XNLI测试集的性能提高了0.8%。</p><p><img src="https://tva1.sinaimg.cn/large/008i3skNly1gwh88qjg53j315k0a040k.jpg" srcset="/img/loading.gif" lazyload alt="image-20211116194259454"></p><h4 id="452-对话语言模型的效果"><a class="markdownIt-Anchor" href="#452-对话语言模型的效果"></a> 4.5.2 对话语言模型的效果</h4><p>我们还对DLM(对话语言模型)任务进行了消融研究。我们使用10%的具有不同比例的训练语料来说明DLM测试对XNLI开发集的贡献。然后对这些数据集从头开始用ERNIE进行预训练,并对5次随机的微调结果取平均值。详细的实验设置和开发集结果如表3所示,我们可以看到,在这个DLM任务中,开发/测试精度提高了0.7%/1.0%。</p><p><img src="https://tva1.sinaimg.cn/large/008i3skNly1gwh8fo59cxj312s08yjsx.jpg" srcset="/img/loading.gif" lazyload alt="image-20211116194944625"></p><h4 id="46-完形填空"><a class="markdownIt-Anchor" href="#46-完形填空"></a> 4.6 完形填空</h4><p>为了验证ERNIE的知识学习能力,我们使用了几个完形填空测试样本(Taylor,1953)来检验模型。在实验中,我们把命名实体从段落中删除,模型需要推断它是什么。有些情况如图4所示。我们比较了bert和ERNIE的预测。</p><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h52x8c316ej20td0ljwmv.jpg" srcset="/img/loading.gif" lazyload alt="img"></p><p>在情况1中,BERT尝试复制出现在上下文中的名称,而ERNIE则记住了文章中提到的有关关系的知识。在情况2和情况5中,BERT可以根据上下文成功学习表现模式,因此可以正确预测命名的实体类型,但是无法使用正确的实体填充插槽。相反,ERNIE可以使用正确的实体填充插槽。在情况3、4、6中,BERT用与句子相关的几个字符填充了空位,但是很难预测语义概念。 ERNIE可以预测除情况4之外的正确实体。尽管ERNIE在情况4中预测了错误的实体,但它可以正确地预测语义类型,并用一个澳大利亚城市填充该位置。总之,这些案例表明ERNIE在基于上下文的知识推理中表现更好。</p><h2 id="5结论"><a class="markdownIt-Anchor" href="#5结论"></a> 5.结论</h2><p>本文提出了一种将知识整合到预训练语言模型中的新方法。在5个中文处理任务上的实验表明,该方法在所有这些任务上都优于Bert。我们还确认,知识集成和对异构数据的预训练都能使模型获得更好的语言表示。</p><p>下一步,我们将会把其他类型的知识集成到语义表示模型中,例如使用句法分析或来自其他任务的弱监督信号。此外,我们还将用其他语言验证这个想法。</p><hr><hr><p>原文链接:<a href="https://arxiv.org/pdf/1904.09223.pdf" target="_blank" rel="noopener">https://arxiv.org/pdf/1904.09223.pdf</a></p><p>ernie学习地址:<a href="https://github.com/PaddlePaddle/ERNIE/blob/develop/README.zh.md" target="_blank" rel="noopener">https://github.com/PaddlePaddle/ERNIE/blob/develop/README.zh.md</a></p>]]></content>
<categories>
<category>自然语言处理</category>
</categories>
<tags>
<tag>NLP</tag>
</tags>
</entry>
<entry>
<title>linux环境下安装Anaconda</title>
<link href="/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/linux%E7%8E%AF%E5%A2%83%E4%B8%8B%E5%AE%89%E8%A3%85Anaconda/"/>
<url>/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/linux%E7%8E%AF%E5%A2%83%E4%B8%8B%E5%AE%89%E8%A3%85Anaconda/</url>
<content type="html"><![CDATA[<h1 id="linux环境下安装anaconda"><a class="markdownIt-Anchor" href="#linux环境下安装anaconda"></a> linux环境下安装Anaconda</h1><h2 id="1下载"><a class="markdownIt-Anchor" href="#1下载"></a> 1.下载:</h2><p>获取anaconda在清华镜像站的网址,然后在服务器端wget 网址就行了。</p><p>清华镜像站中anaconda的所有版本的网址:<a href="https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/" target="_blank" rel="noopener">https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/</a></p><p>找到自己想要的那个版本,然后右键 -> 复制链接地址。</p><p>接下来在服务器端找一个好的目录,wget + 复制好的地址,运行就好。</p><p>如:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.3.1-Linux-x86_64.sh<br></code></pre></td></tr></table></figure><h2 id="2安装"><a class="markdownIt-Anchor" href="#2安装"></a> 2.安装</h2><p>下载好之后,在下载目录目录中,出现一个Anaconda3-5.3.1-Linux-x86_64.sh这样子的文件,运行它就好,切换到该文件目录运行</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">bash Anaconda3-5.3.1-Linux-x86_64.sh<br></code></pre></td></tr></table></figure><p>根据指示操作:</p><p>步骤一:按下ENTER继续。</p><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h392gq76klj217i056dgj.jpg" srcset="/img/loading.gif" lazyload alt="image-20220615174059409"></p><p>步骤二:在按下enter键之后,安装又会停止,并且出现一个“more”的字样,按空格就好。</p><p>步骤三:接收协议,在这里输入“yes”表示接收协议。</p><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h392ioqhb9j20m0023weg.jpg" srcset="/img/loading.gif" lazyload alt="image-20220615174252295"></p><p>步骤四:是否在环境中配置anaconda的环境, 输入yes,不然你自己配环境很麻烦。</p><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h392jz7mc8j20kr0200sw.jpg" srcset="/img/loading.gif" lazyload alt="image-20220615174406581"></p><p>步骤五:是否安装vscode?这个看个人爱好了,一般我选择否,输入no之后,安装完成。</p><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h392kve8oej217c02uaag.jpg" srcset="/img/loading.gif" lazyload alt="image-20220615174458444"></p><blockquote><p>注意:</p><p>需要退出终端后,再次进入才能输入conda命令。</p><p>或者不想退出的话,刷新一下环境变量,之后输入conda就有反应了</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">刷新环境变量命令:<br><span class="hljs-built_in">source</span> .bash_profile<br></code></pre></td></tr></table></figure><p>步骤六:输入<code>conda</code>验证是否安装成功,如果出现如下截图内容,说明安装成功</p><p><img src="https://tva1.sinaimg.cn/large/e6c9d24ely1h392ocm0koj20p80t9wi0.jpg" srcset="/img/loading.gif" lazyload alt="image-20220615174817761"></p><p>接下来就可以愉快的在anaconda中玩耍了。</p>]]></content>
<categories>
<category>计算机相关</category>
</categories>
<tags>
<tag>Linux</tag>
</tags>
</entry>
<entry>
<title>tmux命令总结</title>
<link href="/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/tmux%E5%91%BD%E4%BB%A4%E6%80%BB%E7%BB%93/"/>
<url>/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/tmux%E5%91%BD%E4%BB%A4%E6%80%BB%E7%BB%93/</url>
<content type="html"><![CDATA[<h1 id="tmux命令总结"><a class="markdownIt-Anchor" href="#tmux命令总结"></a> tmux命令总结</h1><h2 id="1-是什么"><a class="markdownIt-Anchor" href="#1-是什么"></a> 1. 是什么</h2><p>tmux即terminal multiplexer(终端复用器),它可以启动一系列终端会话。</p><p>它解绑了会话和终端窗口。关闭终端窗口再打开,会话并不终止,而是继续运行再执行。将会话与终端窗后彻底分离。</p><h2 id="2-怎么用"><a class="markdownIt-Anchor" href="#2-怎么用"></a> 2. 怎么用</h2><h3 id="21-安装"><a class="markdownIt-Anchor" href="#21-安装"></a> 2.1 安装</h3><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs cmake">安装:<br>yum <span class="hljs-keyword">install</span> tmux<br></code></pre></td></tr></table></figure><h3 id="22-入门"><a class="markdownIt-Anchor" href="#22-入门"></a> 2.2 入门</h3><ol><li><p>运行tmux:# tmux</p></li><li><p>新建会话: # tmux new -s SESSION-NAME</p></li><li><p>查看已创建的会话:# tmux ls</p></li><li><p>进入一个已知会话: # tmux a -t SESSION-NAME 或 # <strong>tmux attach -t SESSION-NAME</strong></p></li><li><p>暂时离开当前会话:# tmux detach</p><blockquote><p>该命令会从当前会话中退出去, 因此才会有稍后重新接入会话这么一说</p></blockquote></li><li><p>关闭会话:# tmux kill-session -t SESSION-NAME</p><blockquote><p>在会话内部或外部执行均可</p></blockquote></li></ol><h3 id="23-进阶"><a class="markdownIt-Anchor" href="#23-进阶"></a> 2.3 进阶</h3><h4 id="231-分屏操作"><a class="markdownIt-Anchor" href="#231-分屏操作"></a> 2.3.1 分屏操作</h4><blockquote><p>很多情况下, 需要在一个会话中运行多个命令,执行多个任务,我们可以在一个会话的多个窗口里组织他们。</p></blockquote><blockquote><p>分屏:分为水平分屏和垂直分屏</p></blockquote><ul><li>水平分屏 – 快捷键:先按 ctrl+b, 放开后再按%</li></ul><blockquote><p>如何区分水平分屏和垂直分屏,看%和"在键盘中的大概位置,就可以理解</p></blockquote><ul><li>垂直分屏 – 快捷键:先按 ctrl+b, 放开后再按 "</li><li>分屏后的窗口中光标互相切换 – 快捷键:先按ctrl+b, 放开后再按下o (或者直接方向键)</li></ul><hr><h5 id="使用快捷键"><a class="markdownIt-Anchor" href="#使用快捷键"></a> 使用快捷键</h5><ul><li><strong>左右分屏</strong> :Ctrl + b, % (分割当前窗口)</li><li><strong>上下分屏</strong> :Ctrl + b, " (分割当前窗口)</li><li><strong>关闭分屏</strong> :Ctrl + b, x (关闭所在分屏窗口)</li><li><strong>显示分屏编号</strong> :Ctrl + b, q (显示分屏编号)</li><li><strong>分屏切换</strong> :Ctrl + b, 方向键 (基本可以自由切换)</li></ul><hr><h4 id="232-切换tmux会话终端"><a class="markdownIt-Anchor" href="#232-切换tmux会话终端"></a> 2.3.2 切换tmux会话终端</h4><p>快捷键:先按ctrl+b, 放开后再按s</p><h4 id="233-屏中内容上下滚动模式"><a class="markdownIt-Anchor" href="#233-屏中内容上下滚动模式"></a> 2.3.3 屏中内容上下滚动模式</h4><ul><li>进入tmux翻屏模式:先按 ctrl +b,松开,然后再按 [</li><li>上下翻页:直接通过触摸板控制</li><li>退出:q</li></ul><h4 id="234-当前窗格全屏显示"><a class="markdownIt-Anchor" href="#234-当前窗格全屏显示"></a> 2.3.4 当前窗格全屏显示</h4><ul><li>先按ctrl+b, 放开后再按z:当前窗格全屏显示,再使用一次会变回原来大小</li></ul><h4 id="235-列出当前所有窗口"><a class="markdownIt-Anchor" href="#235-列出当前所有窗口"></a> 2.3.5 列出当前所有窗口</h4><ul><li>先按ctrl+b, 放开后再按w;</li></ul><h2 id="3其他"><a class="markdownIt-Anchor" href="#3其他"></a> 3.其他</h2><ul><li>单独运行tmux命令,即开启一个tmux会话。</li><li>不能在tmux会话里面再新建会话,会报错:“sessions should be nested with care, unset $TMUX to force”。</li><li>终端内显示时间:<ul><li>快捷键:先按ctrl+b, 放开后再按t ;退出时间界面:按q键</li></ul></li></ul><hr><ul><li>参考资料:<ul><li><a href="https://blog.51cto.com/13683137989/1961188" target="_blank" rel="noopener">https://blog.51cto.com/13683137989/1961188</a></li><li><a href="https://zhuanlan.zhihu.com/p/98384704" target="_blank" rel="noopener">https://zhuanlan.zhihu.com/p/98384704</a></li></ul></li></ul>]]></content>
<categories>
<category>计算机相关</category>
</categories>
<tags>
<tag>Linux</tag>
</tags>
</entry>
<entry>
<title>数据分割介绍</title>
<link href="/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ML/%E6%95%B0%E6%8D%AE%E5%88%86%E5%89%B2%E4%BB%8B%E7%BB%8D/"/>
<url>/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ML/%E6%95%B0%E6%8D%AE%E5%88%86%E5%89%B2%E4%BB%8B%E7%BB%8D/</url>
<content type="html"><![CDATA[<p>在机器学习中,我们可<strong>通过实验测试来对学习器的泛化误差进行评估并进而做出选择</strong>。</p><p>为此,需使用一个“测试集”( testing set)来测试学习器对新样本的判别能力,然后<strong>以测试集上的“测试误差” (testing error)作为泛化误差的近似。</strong></p><p>通常我们假设测试样本也是<strong>从样本真实分布中独立同分布采样而得</strong>。但需注意的是,<strong>测试集应该尽可能与训练集互斥。</strong></p><blockquote><p>互斥,即测试样本尽量不在训练集中出现、未在训练过程中使用过。</p></blockquote><p>测试样本为什么要尽可能不出现在训练集中呢?为理解这一点,不妨考虑这样一个场景:</p><blockquote><p>老师出了10道习题供同学们练习,考试时老师又用同样的这10道题作为试题,这个考试成绩能否有效反映出同学们学得好不好呢?</p><p>答案是否定的,可能有的同学只会做这10道题却能得高分。</p></blockquote><p>回到我们的问题上来,我们希望得到泛化性能强的模型,好比是希望同学们对课程学得很好、获得了对所学知识“举一反三”的能力;训练样本相当于给同学们练习的习题,测试过程则相当于考试。显然,<strong>若测试样本被用作训练了,则得到的将是过于“乐观”的估计结果。</strong></p><p>可是,我们只有一个包含m个样例的数据集<img src="https://tva1.sinaimg.cn/large/006tNbRwly1gaa7rhg07vj30js01iweh.jpg" srcset="/img/loading.gif" lazyload alt="image-20191226164011364" style="zoom:50%"></p><p>既要训练,又要测试,怎样才能做到呢?</p><ul><li>答案是:<strong>通过对D进行适当的处理,从中产生出训练集S和测试集T。(这个也是我们前面一直在做的事情)。</strong></li></ul><p>下面我们一起总结一下几种常见的做法:</p><ul><li>留出法</li><li>交叉验证法</li><li>自助法</li></ul><hr><h2 id="1-留出法"><a class="markdownIt-Anchor" href="#1-留出法"></a> 1 留出法</h2><p>“留出法”(hold-out)直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试集T,即<img src="https://tva1.sinaimg.cn/large/006tNbRwgy1gazesd4ngwj309401g745.jpg" srcset="/img/loading.gif" lazyload alt="image-20200117114218755" style="zoom:50%">。在S上训练出模型后,用T来评估其测试误差,作为对泛化误差的估计。</p><p>大家在使用的过程中,<strong>需注意的是,训练/测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响</strong>,例如在分类任务中至少要保持样本的类别比例相似。</p><p>如果从采样( sampling)的角度来看待数据集的划分过程,则保留类别比例的采样方式通常称为**“分层采样”( stratified sampling)。**</p><blockquote><p>例如通过对D进行分层样而获得含70%样本的训练集S和含30%样本的测试集T,</p><p>若D包含500个正例、500个反例,则分层采样得到的S应包含350个正例、350个反例,而T则包含150个正例和150个反例;</p><p>若S、T中样本类别比例差别很大,则误差估计将由于训练/测试数据分布的差异而产生偏差。</p></blockquote><p>另一个需注意的问题是,即便在给定训练测试集的样本比例后,仍存在多种划分方式对初始数据集D进行分割。</p><p>例如在上面的例子中,可以把D中的样本排序,然后把前350个正例放到训练集中,也可以把最后350个正例放到训练集中,这些不同的划分将导致不同的训练/测试集,相应的,模型评估的结果也会有差别。</p><p>因此,单次使用留出法得到的估计结果往往不够稳定可靠,<strong>在使用留出法时,一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。</strong></p><blockquote><p>例如进行100次随机划分,每次产生一个训练/测试集用于实验评估,100次后就得到100个结果,而留出法返回的则是这100个结果的平均。</p></blockquote><p>此外,我们希望评估的是用D训练出的模型的性能,但留出法需划分训练/测试集,这就会导致一个窘境:</p><ul><li>若令训练集S包含绝大多数样本,则训练出的模型可能更接近于用D训练出的模型,但由于T比较小,评估结果可能不够稳定准确;</li><li>若令测试集T多包含一些样本,则训练集S与D差别更大了,被评估的模型与用D训练出的模型相比可能有较大差别,从而降低了评估结果的保真性( fidelity)。</li></ul><p>这个问题没有完美的解决方案,常见做法是将大约2/3~4/5的样本用于训练,剩余样本用于测试。</p><p>使用Python实现留出法:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">from</span> sklearn.model_selection <span class="hljs-keyword">import</span> train_test_split<br><span class="hljs-comment">#使用train_test_split划分训练集和测试集</span><br>train_X , test_X, train_Y ,test_Y = train_test_split(<br> X, Y, test_size=<span class="hljs-number">0.2</span>,random_state=<span class="hljs-number">0</span>)<br></code></pre></td></tr></table></figure><p>在留出法中,有一个特例,叫:<strong>留一法( Leave-One-Out,简称LOO)</strong>,即每次抽取一个样本做为测试集。</p><p>显然,留一法不受随机样本划分方式的影响,因为m个样本只有唯一的方式划分为m个子集一每个子集包含个样本;</p><p>使用Python实现留一法:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">from</span> sklearn.model_selection <span class="hljs-keyword">import</span> LeaveOneOut<br><br>data = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>]<br>loo = LeaveOneOut()<br><span class="hljs-keyword">for</span> train, test <span class="hljs-keyword">in</span> loo.split(data):<br> print(<span class="hljs-string">"%s %s"</span> % (train, test))<br><span class="hljs-string">'''结果</span><br><span class="hljs-string">[1 2 3] [0]</span><br><span class="hljs-string">[0 2 3] [1]</span><br><span class="hljs-string">[0 1 3] [2]</span><br><span class="hljs-string">[0 1 2] [3]</span><br><span class="hljs-string">'''</span><br></code></pre></td></tr></table></figure><p>留一法优缺点:</p><p>优点:</p><ul><li>留一法使用的训练集与初始数据集相比只少了一个样本,这就使得在绝大多数情况下,留一法中被实际评估的模型与期望评估的用D训练出的模型很相似。因此,<strong>留一法的评估结果往往被认为比较准确</strong>。</li></ul><p>缺点:</p><ul><li>留一法也有其缺陷:在数据集比较大时,训练m个模型的计算开销可能是难以忍受的(例如数据集包含1百万个样本,则需训练1百万个模型,而这还是在未考虑算法调参的情况下。</li></ul><h2 id="2-交叉验证法"><a class="markdownIt-Anchor" href="#2-交叉验证法"></a> 2 交叉验证法</h2><p>“交叉验证法”( cross validation)先将数据集D划分为k个大小相似的互斥子集,即<img src="https://tva1.sinaimg.cn/large/006tNbRwgy1gazet6n0dwj30ig01g74a.jpg" srcset="/img/loading.gif" lazyload alt="image-20200117114308300" style="zoom:50%">。每个子集$$D_i$$都尽可能保持数据分布的一致性,即从D中通过分层抽样得到。</p><p>然后,每次用k-1个子集的并集作为训练集,余下的那个子集作为测试集;这样就可获得k组训练/测试集,从而可进行k次训练和测试,最终返回的是这k个测试结果的均值。</p><p>显然,交叉验证法评估结果的稳定性和保真性在很大程度上取决于k的取值,为强调这一点,通常把交叉验证法称为“k折交叉验证”(k- fold cross validation)。k最常用的取值是10,此时称为10折交叉验证;其他常用的k值有5、20等。下图给出了10折交叉验证的示意图。</p><p><img src="https://tva1.sinaimg.cn/large/006tNbRwly1gaa0qilguhj31cg0m2q5k.jpg" srcset="/img/loading.gif" lazyload alt="image-20191226121521481"></p><p>**与留出法相似,将数据集D划分为k个子集同样存在多种划分方式。**为减小因样本划分不同而引入的差别,k折交叉验证通常要随机使用不同的划分重复p次,最终的评估结果是这p次k折交叉验证结果的均值,例如常见的有<br>“10次10折交叉验证”。</p><p>交叉验证实现方法,除了咱们前面讲的GridSearchCV之外,还有KFold, StratifiedKFold</p><h3 id="kfold和stratifiedkfold"><a class="markdownIt-Anchor" href="#kfold和stratifiedkfold"></a> KFold和StratifiedKFold</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">from</span> sklearn.model_selection <span class="hljs-keyword">import</span> KFold,StratifiedKFold<br></code></pre></td></tr></table></figure><ul><li><p>用法:</p><ul><li>将训练/测试数据集划分n_splits个互斥子集,每次用其中一个子集当作验证集,剩下的n_splits-1个作为训练集,进行n_splits次训练和测试,得到n_splits个结果</li><li>StratifiedKFold的用法和KFold的区别是:SKFold是分层采样,确保训练集,测试集中,各类别样本的比例是和原始数据集中的一致。</li></ul></li><li><p>注意点:</p><ul><li>对于不能均等分数据集,其前n_samples % n_splits子集拥有n_samples // n_splits + 1个样本,其余子集都只有n_samples // n_splits样本</li></ul></li><li><p>参数说明:</p><ul><li>n_splits:表示划分几等份</li><li>shuffle:在每次划分时,是否进行洗牌<ul><li>①若为Falses时,其效果等同于random_state等于整数,每次划分的结果相同</li><li>②若为True时,每次划分的结果都不一样,表示经过洗牌,随机取样的</li></ul></li></ul></li><li><p>属性:</p><ul><li>①split(X, y=None, groups=None):将数据集划分成训练集和测试集,返回索引生成器</li></ul></li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np<br><span class="hljs-keyword">from</span> sklearn.model_selection <span class="hljs-keyword">import</span> KFold,StratifiedKFold<br><br>X = np.array([<br> [<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>],<br> [<span class="hljs-number">11</span>,<span class="hljs-number">12</span>,<span class="hljs-number">13</span>,<span class="hljs-number">14</span>],<br> [<span class="hljs-number">21</span>,<span class="hljs-number">22</span>,<span class="hljs-number">23</span>,<span class="hljs-number">24</span>],<br> [<span class="hljs-number">31</span>,<span class="hljs-number">32</span>,<span class="hljs-number">33</span>,<span class="hljs-number">34</span>],<br> [<span class="hljs-number">41</span>,<span class="hljs-number">42</span>,<span class="hljs-number">43</span>,<span class="hljs-number">44</span>],<br> [<span class="hljs-number">51</span>,<span class="hljs-number">52</span>,<span class="hljs-number">53</span>,<span class="hljs-number">54</span>],<br> [<span class="hljs-number">61</span>,<span class="hljs-number">62</span>,<span class="hljs-number">63</span>,<span class="hljs-number">64</span>],<br> [<span class="hljs-number">71</span>,<span class="hljs-number">72</span>,<span class="hljs-number">73</span>,<span class="hljs-number">74</span>]<br>])<br><br>y = np.array([<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">1</span>,<span class="hljs-number">1</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>])<br><br>folder = KFold(n_splits = <span class="hljs-number">4</span>, random_state=<span class="hljs-number">0</span>, shuffle = <span class="hljs-literal">False</span>)<br>sfolder = StratifiedKFold(n_splits = <span class="hljs-number">4</span>, random_state = <span class="hljs-number">0</span>, shuffle = <span class="hljs-literal">False</span>)<br> <br><span class="hljs-keyword">for</span> train, test <span class="hljs-keyword">in</span> folder.split(X, y):<br> print(<span class="hljs-string">'train:%s | test:%s'</span> %(train, test))<br> print(<span class="hljs-string">""</span>)<br> <br><span class="hljs-keyword">for</span> train, test <span class="hljs-keyword">in</span> sfolder.split(X, y):<br> print(<span class="hljs-string">'train:%s | test:%s'</span>%(train, test))<br> print(<span class="hljs-string">""</span>)<br></code></pre></td></tr></table></figure><p>结果:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># 第一个for,输出结果为:</span><br>train:[<span class="hljs-number">2</span> <span class="hljs-number">3</span> <span class="hljs-number">4</span> <span class="hljs-number">5</span> <span class="hljs-number">6</span> <span class="hljs-number">7</span>] | test:[<span class="hljs-number">0</span> <span class="hljs-number">1</span>]<br><br>train:[<span class="hljs-number">0</span> <span class="hljs-number">1</span> <span class="hljs-number">4</span> <span class="hljs-number">5</span> <span class="hljs-number">6</span> <span class="hljs-number">7</span>] | test:[<span class="hljs-number">2</span> <span class="hljs-number">3</span>]<br><br>train:[<span class="hljs-number">0</span> <span class="hljs-number">1</span> <span class="hljs-number">2</span> <span class="hljs-number">3</span> <span class="hljs-number">6</span> <span class="hljs-number">7</span>] | test:[<span class="hljs-number">4</span> <span class="hljs-number">5</span>]<br><br>train:[<span class="hljs-number">0</span> <span class="hljs-number">1</span> <span class="hljs-number">2</span> <span class="hljs-number">3</span> <span class="hljs-number">4</span> <span class="hljs-number">5</span>] | test:[<span class="hljs-number">6</span> <span class="hljs-number">7</span>]<br><br><span class="hljs-comment"># 第二个for,输出结果为:</span><br>train:[<span class="hljs-number">1</span> <span class="hljs-number">3</span> <span class="hljs-number">4</span> <span class="hljs-number">5</span> <span class="hljs-number">6</span> <span class="hljs-number">7</span>] | test:[<span class="hljs-number">0</span> <span class="hljs-number">2</span>]<br><br>train:[<span class="hljs-number">0</span> <span class="hljs-number">2</span> <span class="hljs-number">4</span> <span class="hljs-number">5</span> <span class="hljs-number">6</span> <span class="hljs-number">7</span>] | test:[<span class="hljs-number">1</span> <span class="hljs-number">3</span>]<br><br>train:[<span class="hljs-number">0</span> <span class="hljs-number">1</span> <span class="hljs-number">2</span> <span class="hljs-number">3</span> <span class="hljs-number">5</span> <span class="hljs-number">7</span>] | test:[<span class="hljs-number">4</span> <span class="hljs-number">6</span>]<br><br>train:[<span class="hljs-number">0</span> <span class="hljs-number">1</span> <span class="hljs-number">2</span> <span class="hljs-number">3</span> <span class="hljs-number">4</span> <span class="hljs-number">6</span>] | test:[<span class="hljs-number">5</span> <span class="hljs-number">7</span>]<br></code></pre></td></tr></table></figure><p>可以看出,sfold进行4折计算时候,是平衡了测试集中,样本正负的分布的;但是fold却没有。</p><h2 id="3-自助法"><a class="markdownIt-Anchor" href="#3-自助法"></a> 3 自助法</h2><p>我们希望评估的是用D训练出的模型。但在留出法和交叉验证法中,由于保留了一部分样本用于测试,因此**实际评估的模型所使用的训练集比D小,**这必然会引入一些因训练样本规模不同而导致的估计偏差。留一法受训练样本规模变化的影响较小,但计算复杂度又太高了。</p><p>有没有什么办法可以减少训练样本规模不同造成的影响,同时还能比较高效地进行实验估计呢?</p><p>“自助法”( bootstrapping)是一个比较好的解决方案,它<strong>直接以自助采样法( bootstrap sampling)为基础</strong>。给定包含m个样本的数据集D,我们对它进行采样产生数据集D:</p><ul><li>每次随机从D中挑选一个样本,将其拷贝放入D,然后再将该样本放回初始数据集D中,使得该样本在下次采样时仍有可能被到;</li><li>这个过程重复执行m次后,我们就得到了包含m个样本的数据集D′,这就是自助采样的结果。</li></ul><p>显然,D中有一部分样本会在D′中多次出现,而另一部分样本不出现。可以做一个简单的估计,样本在m次采样中始终不被采到的概率是$$(1-\frac{1}{m})^m$$,取极限得到</p><img src="https://tva1.sinaimg.cn/large/006tNbRwly1gaa4wbuxlvj30ge03m3yq.jpg" srcset="/img/loading.gif" lazyload alt="image-20191226150103208" style="zoom:50%"><p>即通过自助采样,初始数据集D中约有36.8%的样本未出现在采样数据集D′中。</p><p>于是我们可将D′用作训练集,D\D′用作测试集;这样,实际评估的模型与期望评估的模型都使用m个训练样本,而我们仍有数据总量约1/3的、没在训练集中出现的样本用于测试。</p><p>这样的测试结果,亦称**“包外估计”(out- of-bagestimate)**</p><p>自助法优缺点:</p><ul><li>优点:<ul><li>自助法在数据集较小、难以有效划分训练/测试集时很有用;</li><li>此外,自助法能从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大的好处。</li></ul></li><li>缺点:<ul><li>自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差。因此,在初始数据量足够时;留出法和交叉验证法更常用一些。</li></ul></li></ul><h2 id="4-总结"><a class="markdownIt-Anchor" href="#4-总结"></a> 4 总结</h2><p><strong>综上所述:</strong></p><ul><li>当我们数据量足够时,选择留出法简单省时,在牺牲很小的准确度的情况下,换取计算的简便;</li><li>当我们的数据量较小时,我们应该选择交叉验证法,因为此时划分样本集将会使训练数据过少;</li><li>当我们的数据量特别少的时候,我们可以考虑留一法。</li></ul>]]></content>
<categories>
<category>机器学习</category>
</categories>
<tags>
<tag>ML</tag>
</tags>
</entry>
<entry>
<title>DeepFM</title>
<link href="/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ML/DeepFM/"/>
<url>/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ML/DeepFM/</url>
<content type="html"><![CDATA[<h1 id="deepfm"><a class="markdownIt-Anchor" href="#deepfm"></a> DeepFM</h1><ul><li>在前面一篇文章中提到,目前遇到特征组合的问题,主流做法主要会分成两类:FM系列、DNN系列。</li><li>关于DNN相关内容,是深度学习基础知识,本处不展开介绍,直接使用。本文主要介绍FM+DNN的结合体:DeepFM相关内容。</li><li>文章依旧主要从三方面展开对FM算法介绍<ul><li>When – 什么时候需要考虑DeepFM算法</li><li>What – 究竟什么是DeepFM算法</li><li>How – DeepFM怎么使用</li></ul></li></ul><h2 id="1-when"><a class="markdownIt-Anchor" href="#1-when"></a> 1. When</h2><blockquote><p>什么时候需要考虑DeepFM</p></blockquote><ul><li><p>基于CTR预估的推荐系统,究其根本,其实是学习到用户点击行为背后隐含的特征组合。在各种各样的推荐场景中,低阶特征组合或者高阶的特征组合都会对最终用户的行为产生影响。</p></li><li><p>之前介绍的FM通过对每一维特征的隐变量内积提取特征组合,最终结果还算不错。</p></li><li><p><strong>虽然理论上FM可以对高阶特征组合进行建模,可是因为计算复杂度的原因一般到二阶的特征组合就结束。</strong></p></li><li><p>那么高阶特征该怎么办呢,此时你应该会和很多大牛的想法一样,<strong>通过多层的神经网络去解决</strong>。</p></li></ul><h3 id="11-dnn的局限性"><a class="markdownIt-Anchor" href="#11-dnn的局限性"></a> 1.1 DNN的局限性</h3><blockquote><p>以下图片内容参考自张俊林教授在AI大会上的分享</p></blockquote><p>我们知道,对于离散特征的处理,一般都是把特征转换为one-hot编码形式,不过把one-hot编码类型的特征输入到DNN中,会导致网络参数过多:</p><p><img src="https://tva1.sinaimg.cn/large/008eGmZEly1go977k8rt5j30lk05xaby.jpg" srcset="/img/loading.gif" lazyload alt="image-20210305182007165"></p><p>就如上图,从输入层到隐藏层,将会产生50亿的参数。</p><p>解决上面这个问题的方法是:把特征分为不同的field,从one-hot变成dense vector:<br><img src="https://tva1.sinaimg.cn/large/008eGmZEly1go97b76v0ij30fi05n0ue.jpg" srcset="/img/loading.gif" lazyload alt="image-20210305182339599"></p><p>然后再添加两层全连接层,让其和dense vector进行组合,此时高阶特征的组合就搞定了</p><p><img src="https://tva1.sinaimg.cn/large/008eGmZEly1go97d6ugumj30un0dttcm.jpg" srcset="/img/loading.gif" lazyload alt="img"></p><p>不过上面方式把低阶和高阶特征组合隐含的体现在隐藏层中,如果我们希望把低阶特征组合单独建模,然后融合高阶特征组合。又该怎么做呢?</p><p><img src="https://tva1.sinaimg.cn/large/008eGmZEly1go97et8lm1j30xc0cvwj4.jpg" srcset="/img/loading.gif" lazyload alt="img"></p><h3 id="12-模型融合方式"><a class="markdownIt-Anchor" href="#12-模型融合方式"></a> 1.2 模型融合方式</h3><p>此时,我们能想到的就是把</p><p>DNN与FM进行一个合理的融合:</p><p><img src="https://tva1.sinaimg.cn/large/008eGmZEly1go97fy3w43j30wv0csaed.jpg" srcset="/img/loading.gif" lazyload alt="img"></p><p>二者的融合总的来说有两种形式,<strong>一是串行结构,二是并行结构。</strong></p><p>融合方式一:并行结构</p><p><img src="https://tva1.sinaimg.cn/large/008eGmZEly1go97hljpc4j30hv0780v7.jpg" srcset="/img/loading.gif" lazyload alt="image-20210305182948505"></p><p>融合方式二:串行结构</p><p><img src="https://tva1.sinaimg.cn/large/008eGmZEly1go97jvj7luj30ht082wgs.jpg" srcset="/img/loading.gif" lazyload alt="image-20210305183159763"></p><p>而我们今天要讲到的<strong>DeepFM,就是并行结构中的一种典型代表</strong>。</p><h2 id="2-what"><a class="markdownIt-Anchor" href="#2-what"></a> 2. What</h2><blockquote><p>究竟什么是DeepFM算法</p></blockquote><h3 id="21-简单介绍"><a class="markdownIt-Anchor" href="#21-简单介绍"></a> 2.1 简单介绍</h3><p>DeepFM是2017年华为诺亚方舟实验室发表的一篇论文。</p><p>论文链接:<a href="https://arxiv.org/pdf/1703.04247.pdf" target="_blank" rel="noopener">https://arxiv.org/pdf/1703.04247.pdf</a></p><p>DeepFM整体结构:</p><p><img src="https://tva1.sinaimg.cn/large/008eGmZEly1go99tc16rkj319s0mq4d5.jpg" srcset="/img/loading.gif" lazyload alt="image-20210305195016766"></p><p>根据上图,我们把图像分成左半部分和右半部分,其实**这也就是DeepFM包含的两部分:DNN部分和FM部分,其中DNN部分负责高阶特征的提取,FM部分负责低阶特征的提取。**这两部分共享同样的输入。</p><h3 id="22-模型细节"><a class="markdownIt-Anchor" href="#22-模型细节"></a> 2.2 模型细节</h3><p>接下来,我们从下往上,分别看一下组成DeepFM的各个部分。</p><h4 id="a-架构间参数的传递"><a class="markdownIt-Anchor" href="#a-架构间参数的传递"></a> a) 架构间参数的传递</h4><p><img src="https://tva1.sinaimg.cn/large/008eGmZEly1go9adur1ukj30p10cfqb9.jpg" srcset="/img/loading.gif" lazyload alt="联合"></p><p>架构间参数的传递,有几处需要注意,尤其是上面标记红色圈中部分。</p><ul><li>其中1中,是针对不同特征做的embedding【FM的二阶两两交互计算部分和 deep部分是共享这个embedding结果的】</li><li>2是FM的一阶计算部分【使用权重直接对原始特征做的一阶计算】</li><li>3是对应FM的二阶计算阶段,对经过权重embedding的结果做二阶交叉计算</li><li>4是deep部分的全连接计算部分,使用神经网络进行计算</li></ul><h4 id="b-fm计算的过程"><a class="markdownIt-Anchor" href="#b-fm计算的过程"></a> b) FM计算的过程</h4><p><img src="https://tva1.sinaimg.cn/large/008eGmZEly1go9arbzi10j31f40nwjtj.jpg" srcset="/img/loading.gif" lazyload alt="image-20210305202257417"></p><p>FM的计算公式,我们在之前文章中讲过,此处拿来直接使用:</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mover accent="true"><mi>y</mi><mo>^</mo></mover><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mi>w</mi><mn>0</mn></msub><mo>+</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><msub><mi>w</mi><mi>i</mi></msub><msub><mi>x</mi><mi>i</mi></msub></mrow><mo>+</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><munderover><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mi>i</mi><mo>+</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><mo><</mo><msub><mi>v</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>v</mi><mi>j</mi></msub><mo>></mo><msub><mi>x</mi><mi>i</mi></msub><msub><mi>x</mi><mi>j</mi></msub></mrow></mrow></mrow><annotation encoding="application/x-tex">\hat{y}(x) = w_0+\sum^{n}_{i=1}{w_ix_i}+\sum^{n}_{i=1}{\sum^{n}_{j=i+1}{<v_i,v_j>x_ix_j}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.69444em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-.19444em">^</span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.19444em"><span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.73333em;vertical-align:-.15em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.02691em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:2.929066em;vertical-align:-1.277669em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000002em"><span style="top:-1.872331em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em"><span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:-.02691em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:3.0651740000000007em;vertical-align:-1.4137769999999998em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000002em"><span style="top:-1.872331em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em"><span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000007em"><span style="top:-1.872331em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span><span class="mrel mtight">=</span><span class="mord mathdefault mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:1.4137769999999998em"><span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mrel"><</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.311664em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.286108em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">></span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.311664em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.286108em"><span></span></span></span></span></span></span></span></span></span></span></span></span></p><ul><li><p>上公式中,第一项和第二项公式对应上面标圈部分1的内容,即:</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>w</mi><mn>0</mn></msub><mo>+</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><msub><mi>w</mi><mi>i</mi></msub><msub><mi>x</mi><mi>i</mi></msub></mrow></mrow><annotation encoding="application/x-tex">w_0+\sum^{n}_{i=1}{w_ix_i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.73333em;vertical-align:-.15em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.02691em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:2.929066em;vertical-align:-1.277669em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000002em"><span style="top:-1.872331em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em"><span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:-.02691em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span></span></span></p></li><li><p>公式中第三项公式对应上面标圈部分2的内容,即:</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><munderover><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mi>i</mi><mo>+</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><mo><</mo><msub><mi>v</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>v</mi><mi>j</mi></msub><mo>></mo><msub><mi>x</mi><mi>i</mi></msub><msub><mi>x</mi><mi>j</mi></msub></mrow></mrow></mrow><annotation encoding="application/x-tex">\sum^{n}_{i=1}{\sum^{n}_{j=i+1}{<v_i,v_j>x_ix_j}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:3.0651740000000007em;vertical-align:-1.4137769999999998em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000002em"><span style="top:-1.872331em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em"><span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000007em"><span style="top:-1.872331em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span><span class="mrel mtight">=</span><span class="mord mathdefault mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:1.4137769999999998em"><span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mrel"><</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.311664em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.286108em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">></span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.311664em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.286108em"><span></span></span></span></span></span></span></span></span></span></span></span></span></p></li></ul><h4 id="c-dnn部分"><a class="markdownIt-Anchor" href="#c-dnn部分"></a> c) DNN部分</h4><img src="https://tva1.sinaimg.cn/large/008eGmZEly1go9b2vrn1yj30yy0i6jxt.jpg" srcset="/img/loading.gif" lazyload alt="image-20210305203403298" style="zoom:50%"><p>DNN是一个前馈神经网络。与图像或者语音这类输入不同,图像语音的输入一般是连续而且密集的,然而用于CTR的输入一般是极其稀疏的。因此需要重新设计网络结构。具体实现中为,在第一层隐含层之前,引入一个嵌入层来完成将输入向量压缩到低维稠密向量。</p><img src="https://tva1.sinaimg.cn/large/008eGmZEly1go9b4c6fpvj31540b20x9.jpg" srcset="/img/loading.gif" lazyload alt="image-20210305203527570" style="zoom:50%"><p>嵌入层(embedding layer)的结构如上图所示。当前网络结构有两个特性:</p><ul><li>1)尽管不同field的输入长度不同,但是embedding之后向量的长度均为K。</li><li>2)在FM里得到的隐变量<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>V</mi><mrow><mi>i</mi><mi>k</mi></mrow></msub></mrow><annotation encoding="application/x-tex">V_{ik}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.22222em">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.33610799999999996em"><span style="top:-2.5500000000000003em;margin-left:-.22222em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mord mathdefault mtight" style="margin-right:.03148em">k</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>现在作为了嵌入层网络的权重。</li></ul><h4 id="d-deepfm预测结果输出"><a class="markdownIt-Anchor" href="#d-deepfm预测结果输出"></a> d) DeepFM预测结果输出</h4><p>最后,上DeepFM中FM和DNN预测结果的输出方式:</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mover accent="true"><mi>y</mi><mo>^</mo></mover><mo>=</mo><mi>s</mi><mi>i</mi><mi>g</mi><mi>m</mi><mi>o</mi><mi>i</mi><mi>d</mi><mo stretchy="false">(</mo><msub><mi>y</mi><mrow><mi>F</mi><mi>M</mi></mrow></msub><mo>+</mo><msub><mi>y</mi><mrow><mi>D</mi><mi>N</mi><mi>N</mi></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\hat{y}=sigmoid(y_{FM}+y_{DNN})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.8888799999999999em;vertical-align:-.19444em"></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.69444em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-.19444em">^</span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.19444em"><span></span></span></span></span></span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault">s</span><span class="mord mathdefault">i</span><span class="mord mathdefault" style="margin-right:.03588em">g</span><span class="mord mathdefault">m</span><span class="mord mathdefault">o</span><span class="mord mathdefault">i</span><span class="mord mathdefault">d</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.13889em">F</span><span class="mord mathdefault mtight" style="margin-right:.10903em">M</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.32833099999999993em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.02778em">D</span><span class="mord mathdefault mtight" style="margin-right:.10903em">N</span><span class="mord mathdefault mtight" style="margin-right:.10903em">N</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><h2 id="3how"><a class="markdownIt-Anchor" href="#3how"></a> 3.How</h2><blockquote><p>DeepFM怎么使用</p></blockquote><p>推荐百度官方基于paddlepaddle实现框架:</p><ul><li>链接:<a href="https://github.com/PaddlePaddle/models/tree/develop/PaddleRec/ctr/deepfm_dygraph" target="_blank" rel="noopener">https://github.com/PaddlePaddle/models/tree/develop/PaddleRec/ctr/deepfm_dygraph</a></li></ul><blockquote><p>Ps:参考readme运行一遍就搞定。</p></blockquote><h2 id="参考资料"><a class="markdownIt-Anchor" href="#参考资料"></a> 参考资料:</h2><p>资料一:<a href="https://arxiv.org/pdf/1703.04247.pdf" target="_blank" rel="noopener">https://arxiv.org/pdf/1703.04247.pdf</a></p><p>资料二:<a href="https://zhuanlan.zhihu.com/p/67795161" target="_blank" rel="noopener">https://zhuanlan.zhihu.com/p/67795161</a></p><p>资料三:<a href="http://wiki.baidu.com/pages/viewpage.action?pageId=765563246" target="_blank" rel="noopener">http://wiki.baidu.com/pages/viewpage.action?pageId=765563246</a></p><p>资料四:<a href="https://github.com/PaddlePaddle/models/tree/develop/PaddleRec/ctr/deepfm_dygraph" target="_blank" rel="noopener">https://github.com/PaddlePaddle/models/tree/develop/PaddleRec/ctr/deepfm_dygraph</a></p>]]></content>
<categories>
<category>机器学习</category>
</categories>
<tags>
<tag>ML</tag>
</tags>
</entry>
<entry>
<title>因子分解机(Factorization Machines)</title>
<link href="/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ML/%E5%9B%A0%E5%AD%90%E5%88%86%E8%A7%A3%E6%9C%BA%EF%BC%88Factorization%20Machines%EF%BC%89/"/>
<url>/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ML/%E5%9B%A0%E5%AD%90%E5%88%86%E8%A7%A3%E6%9C%BA%EF%BC%88Factorization%20Machines%EF%BC%89/</url>
<content type="html"><![CDATA[<h1 id="因子分解机factorization-machines"><a class="markdownIt-Anchor" href="#因子分解机factorization-machines"></a> 因子分解机(Factorization Machines)</h1><ul><li>在推荐系统中,CTR(click-through rate)预估是非常重要的环节,其主要是用于判断一个商品是否被用于推荐。谈到CTR预估,有一个算法不得不提一下,LR(logistic regression)逻辑回归。</li><li>在推荐系统发展的历史长河中,LR绝对有浓墨重彩的一笔。比如在2020年和微博做算法的同学交流,对方称他们依旧在推荐中使用LR,当然这离不开其非常容易实现大规模实时并行处理的优势。</li><li>我们知道LR模型其实是一种线性的学习模型,所以它并不可以获取一些高阶特征(非线性)的信息。但是我们在处理多特征的推荐模型时,除了单特征外,有时候还想对一些特征进行组合。</li><li>关于<strong>遇到特征组合的问题,目前主流做法主要分为两类:FM系列、DNN系列</strong>。本文将着重介绍FM算法。</li><li>文章主要从三方面展开对FM算法介绍<ul><li>When – 什么时候需要考虑FM算法</li><li>What – 究竟什么是FM算法</li><li>How – FM怎么使用</li></ul></li></ul><h2 id="1-when"><a class="markdownIt-Anchor" href="#1-when"></a> 1. When</h2><blockquote><p>什么时候需要考虑FM算法</p></blockquote><p>需要考虑的情况:</p><ul><li>情况一:<ul><li>在建模过程中,除了考虑单个特征,还需要考虑特征与特征之间的关联信息时。比如,企业产品个性化定价中,我们除了想知道收入水平、教育水平对用户购买会员的影响,还想知道这两者组合起来对购买会员的影响。</li></ul></li><li>情况二:<ul><li>当特征下包含分类比较多的时候,如果通过one-hot处理,就会形成高维的稀疏矩阵,此时直接计算会导致计算量太大,特征权重更新较慢。比如,依旧是企业中个性化定价项目中,特征<code>职业类别</code>会包含很多分类,one-hot编码后,特征空间一下子就会暴增,导致计算量太大,甚至会形成维灾难。</li></ul></li></ul><p>FM算法的优势就是对上面两种情况的处理。</p><ul><li>第一,进行特征组合,通过两两特征组合,引入了交叉项得分;</li><li>其次,针对维灾难问题,通过引入隐向量,同时对参数矩阵进行矩阵分解,完成对特征的参数估计。</li></ul><h2 id="2-what"><a class="markdownIt-Anchor" href="#2-what"></a> 2. What</h2><blockquote><p>究竟什么是FM算法</p></blockquote><h3 id="21-简单介绍"><a class="markdownIt-Anchor" href="#21-简单介绍"></a> 2.1 简单介绍</h3><ul><li>因子分解机(Factorization Machines,简称为FM)是2010年由<em>Steffen Rendle</em>提出,是一种基于矩阵分解的机器学习算法。</li><li>主要用于<strong>解决数据稀疏的业务场景下(如推荐业务),特征怎样组合的问题,可以用于求解分类、回归和排序问题。</strong></li><li>原文:<a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.393.8529&rep=rep1&type=pdf" target="_blank" rel="noopener">Factorization Machines</a></li></ul><h3 id="22-公式推导"><a class="markdownIt-Anchor" href="#22-公式推导"></a> 2.2 公式推导</h3><p>在引出FM算法前,先看一下线性回归表达式:</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>y</mi><mo>=</mo><msub><mi>w</mi><mn>0</mn></msub><mo>+</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><msub><mi>w</mi><mi>i</mi></msub><msub><mi>x</mi><mi>i</mi></msub></mrow></mrow><annotation encoding="application/x-tex">y = w_0+\sum^{n}_{i=1}{w_ix_i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.73333em;vertical-align:-.15em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.02691em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:2.929066em;vertical-align:-1.277669em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000002em"><span style="top:-1.872331em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em"><span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:-.02691em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span></span></span></p><blockquote><p>其中<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>w</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">w_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.58056em;vertical-align:-.15em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.02691em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>为偏置,<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>w</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">w_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.58056em;vertical-align:-.15em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:-.02691em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>为每个特征<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">x_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.58056em;vertical-align:-.15em"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>对应的权重值。</p></blockquote><p>我们在前面讨论过线性回归模型最大的缺点就是只能解决单个特征或者需要人工进行特征组合,那么是否可以把特征组合的能力体现在模型的层面呢,显然OK,如下公式:</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>y</mi><mo>=</mo><msub><mi>w</mi><mn>0</mn></msub><mo>+</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><msub><mi>w</mi><mi>i</mi></msub><msub><mi>x</mi><mi>i</mi></msub></mrow><mo>+</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><munderover><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mi>i</mi><mo>+</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><msub><mi>w</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub><msub><mi>x</mi><mi>i</mi></msub><msub><mi>x</mi><mi>j</mi></msub></mrow></mrow></mrow><annotation encoding="application/x-tex">y = w_0+\sum^{n}_{i=1}{w_ix_i}+\sum^{n}_{i=1}{\sum^{n}_{j=i+1}{w_{ij}x_ix_j}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.73333em;vertical-align:-.15em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.02691em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:2.929066em;vertical-align:-1.277669em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000002em"><span style="top:-1.872331em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em"><span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:-.02691em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:3.0651740000000007em;vertical-align:-1.4137769999999998em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000002em"><span style="top:-1.872331em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em"><span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000007em"><span style="top:-1.872331em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span><span class="mrel mtight">=</span><span class="mord mathdefault mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:1.4137769999999998em"><span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.311664em"><span style="top:-2.5500000000000003em;margin-left:-.02691em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.286108em"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.311664em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.286108em"><span></span></span></span></span></span></span></span></span></span></span></span></span></p><blockquote><p>上面公式,是把两两组合的特征引入模型了,但是又出现了另一个问题,这个组合的特征泛化能力太弱了,因为如果在训练数据中,<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>i</mi></msub><msub><mi>x</mi><mi>j</mi></msub><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">x_ix_j=0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.716668em;vertical-align:-.286108em"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.311664em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.286108em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.64444em;vertical-align:0"></span><span class="mord">0</span></span></span></span>,那么<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>w</mi><mrow><mi>i</mi><mo separator="true">,</mo><mi>j</mi></mrow></msub><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">w_{i,j}=0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.716668em;vertical-align:-.286108em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.311664em"><span style="top:-2.5500000000000003em;margin-left:-.02691em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mpunct mtight">,</span><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.286108em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.64444em;vertical-align:0"></span><span class="mord">0</span></span></span></span>。结果就是<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>w</mi><mrow><mi>i</mi><mo separator="true">,</mo><mi>j</mi></mrow></msub></mrow><annotation encoding="application/x-tex">w_{i,j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.716668em;vertical-align:-.286108em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.311664em"><span style="top:-2.5500000000000003em;margin-left:-.02691em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mpunct mtight">,</span><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.286108em"><span></span></span></span></span></span></span></span></span></span>无法通过训练得出。</p></blockquote><p>为了求解<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>w</mi><mrow><mi>i</mi><mo separator="true">,</mo><mi>j</mi></mrow></msub></mrow><annotation encoding="application/x-tex">w_{i,j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.716668em;vertical-align:-.286108em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.311664em"><span style="top:-2.5500000000000003em;margin-left:-.02691em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mpunct mtight">,</span><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.286108em"><span></span></span></span></span></span></span></span></span></span>,我们对每个特征分量<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">x_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.58056em;vertical-align:-.15em"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>引入辅助向量<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>v</mi><mi>i</mi></msub><mo>=</mo><mo stretchy="false">(</mo><msub><mi>v</mi><mrow><mi>i</mi><mn>1</mn></mrow></msub><mo separator="true">,</mo><msub><mi>v</mi><mrow><mi>i</mi><mn>2</mn></mrow></msub><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo separator="true">,</mo><msub><mi>v</mi><mrow><mi>i</mi><mi>k</mi></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">v_i=(v_{i1},v_{i2},...,v_{ik})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.58056em;vertical-align:-.15em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.33610799999999996em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mord mathdefault mtight" style="margin-right:.03148em">k</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>。然后,利用<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>v</mi><mi>i</mi></msub><msubsup><mi>v</mi><mi>j</mi><mi>T</mi></msubsup></mrow><annotation encoding="application/x-tex">v_iv_j^T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.236103em;vertical-align:-.394772em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.8413309999999999em"><span style="top:-2.441336em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span></span></span><span style="top:-3.063em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:.13889em">T</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.394772em"><span></span></span></span></span></span></span></span></span></span>对<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>w</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub></mrow><annotation encoding="application/x-tex">w_{ij}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.716668em;vertical-align:-.286108em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.311664em"><span style="top:-2.5500000000000003em;margin-left:-.02691em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.286108em"><span></span></span></span></span></span></span></span></span></span>进行求解(根据矩阵分解思路:对于正定矩阵W,存在矩阵V,使得<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>W</mi><mo>=</mo><mi>V</mi><msup><mi>V</mi><mi>T</mi></msup></mrow><annotation encoding="application/x-tex">W=VV^T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.68333em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.13889em">W</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.8413309999999999em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.22222em">V</span><span class="mord"><span class="mord mathdefault" style="margin-right:.22222em">V</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.8413309999999999em"><span style="top:-3.063em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:.13889em">T</span></span></span></span></span></span></span></span></span></span></span>);</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>V</mi><mo>=</mo><mrow><mo fence="true">[</mo><mtable rowspacing="0.15999999999999992em" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>v</mi><mn>11</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>v</mi><mn>12</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo>⋯</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>v</mi><mrow><mn>1</mn><mi>k</mi></mrow></msub></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>v</mi><mn>21</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>v</mi><mn>22</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo>⋯</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>v</mi><mrow><mn>2</mn><mi>k</mi></mrow></msub></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mi mathvariant="normal">⋮</mi><mpadded height="+0em" voffset="0em"><mspace mathbackground="black" width="0em" height="1.5em"></mspace></mpadded></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mi mathvariant="normal">⋮</mi><mpadded height="+0em" voffset="0em"><mspace mathbackground="black" width="0em" height="1.5em"></mspace></mpadded></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo>⋱</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mi mathvariant="normal">⋮</mi><mpadded height="+0em" voffset="0em"><mspace mathbackground="black" width="0em" height="1.5em"></mspace></mpadded></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>v</mi><mrow><mi>n</mi><mn>1</mn></mrow></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>v</mi><mrow><mi>n</mi><mn>2</mn></mrow></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo>⋯</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>v</mi><mrow><mi>n</mi><mi>k</mi></mrow></msub></mstyle></mtd></mtr></mtable><mo fence="true">]</mo></mrow><mo>=</mo><mrow><mo fence="true">[</mo><mtable rowspacing="0.15999999999999992em" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>V</mi><mn>1</mn></msub></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>V</mi><mn>2</mn></msub></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mi mathvariant="normal">⋮</mi><mpadded height="+0em" voffset="0em"><mspace mathbackground="black" width="0em" height="1.5em"></mspace></mpadded></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>V</mi><mi>n</mi></msub></mstyle></mtd></mtr></mtable><mo fence="true">]</mo></mrow></mrow><annotation encoding="application/x-tex">V= \left[ \begin{matrix} v_{11} & v_{12} & \cdots & v_{1k} \\ v_{21} & v_{22} & \cdots & v_{2k} \\ \vdots & \vdots & \ddots & \vdots \\ v_{n1} & v_{n2} & \cdots & v_{nk} \\ \end{matrix} \right] = \left[ \begin{matrix} V_{1} \\ V_{2} \\ \vdots \\ V_{n} \\ \end{matrix} \right]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.68333em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.22222em">V</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:5.459999999999999em;vertical-align:-2.4799999999999995em"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.953005em"><span style="top:-1.3499850000000007em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎣</span></span></span><span style="top:-2.5049850000000005em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎢</span></span></span><span style="top:-3.1059850000000004em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎢</span></span></span><span style="top:-3.7069850000000004em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎢</span></span></span><span style="top:-4.953005em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎡</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:2.4500349999999997em"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.9799999999999995em"><span style="top:-5.8275em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span><span style="top:-4.6275em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span><span style="top:-2.7674999999999996em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord">⋮</span><span class="mord rule" style="border-right-width:0;border-top-width:1.5em;bottom:0"></span></span></span></span><span style="top:-1.5675000000000006em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:2.4799999999999995em"><span></span></span></span></span></span><span class="arraycolsep" style="width:.5em"></span><span class="arraycolsep" style="width:.5em"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.9799999999999995em"><span style="top:-5.8275em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span><span style="top:-4.6275em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span><span style="top:-2.7674999999999996em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord">⋮</span><span class="mord rule" style="border-right-width:0;border-top-width:1.5em;bottom:0"></span></span></span></span><span style="top:-1.5675000000000006em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:2.4799999999999995em"><span></span></span></span></span></span><span class="arraycolsep" style="width:.5em"></span><span class="arraycolsep" style="width:.5em"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.9799999999999995em"><span style="top:-5.64em"><span class="pstrut" style="height:3.5em"></span><span class="mord"><span class="minner">⋯</span></span></span><span style="top:-4.44em"><span class="pstrut" style="height:3.5em"></span><span class="mord"><span class="minner">⋯</span></span></span><span style="top:-2.5799999999999996em"><span class="pstrut" style="height:3.5em"></span><span class="mord"><span class="minner">⋱</span></span></span><span style="top:-1.3800000000000006em"><span class="pstrut" style="height:3.5em"></span><span class="mord"><span class="minner">⋯</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:2.4799999999999995em"><span></span></span></span></span></span><span class="arraycolsep" style="width:.5em"></span><span class="arraycolsep" style="width:.5em"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.9799999999999995em"><span style="top:-5.8275em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.33610799999999996em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mathdefault mtight" style="margin-right:.03148em">k</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span><span style="top:-4.6275em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.33610799999999996em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span><span class="mord mathdefault mtight" style="margin-right:.03148em">k</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span><span style="top:-2.7674999999999996em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord">⋮</span><span class="mord rule" style="border-right-width:0;border-top-width:1.5em;bottom:0"></span></span></span></span><span style="top:-1.5675000000000006em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.33610799999999996em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mord mathdefault mtight" style="margin-right:.03148em">k</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:2.4799999999999995em"><span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.953005em"><span style="top:-1.3499850000000007em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎦</span></span></span><span style="top:-2.5049850000000005em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎥</span></span></span><span style="top:-3.1059850000000004em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎥</span></span></span><span style="top:-3.7069850000000004em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎥</span></span></span><span style="top:-4.953005em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎤</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:2.4500349999999997em"><span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:5.459999999999999em;vertical-align:-2.4799999999999995em"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.953005em"><span style="top:-1.3499850000000007em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎣</span></span></span><span style="top:-2.5049850000000005em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎢</span></span></span><span style="top:-3.1059850000000004em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎢</span></span></span><span style="top:-3.7069850000000004em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎢</span></span></span><span style="top:-4.953005em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎡</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:2.4500349999999997em"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.9799999999999995em"><span style="top:-5.8275em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.22222em">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.22222em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span><span style="top:-4.6275em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.22222em">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.22222em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span><span style="top:-2.7674999999999996em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord">⋮</span><span class="mord rule" style="border-right-width:0;border-top-width:1.5em;bottom:0"></span></span></span></span><span style="top:-1.5675000000000006em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.22222em">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.151392em"><span style="top:-2.5500000000000003em;margin-left:-.22222em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:2.4799999999999995em"><span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.953005em"><span style="top:-1.3499850000000007em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎦</span></span></span><span style="top:-2.5049850000000005em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎥</span></span></span><span style="top:-3.1059850000000004em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎥</span></span></span><span style="top:-3.7069850000000004em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎥</span></span></span><span style="top:-4.953005em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎤</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:2.4500349999999997em"><span></span></span></span></span></span></span></span></span></span></span></span></p><p>那么<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>w</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub></mrow><annotation encoding="application/x-tex">w_{ij}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.716668em;vertical-align:-.286108em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.311664em"><span style="top:-2.5500000000000003em;margin-left:-.02691em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.286108em"><span></span></span></span></span></span></span></span></span></span>组成的矩阵可以表示成:</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mover accent="true"><mi>W</mi><mo>^</mo></mover><mo>=</mo><mi>V</mi><msup><mi>V</mi><mi>T</mi></msup><mo>=</mo><mrow><mo fence="true">[</mo><mtable rowspacing="0.15999999999999992em" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>V</mi><mn>1</mn></msub></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>V</mi><mn>2</mn></msub></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mi mathvariant="normal">⋮</mi><mpadded height="+0em" voffset="0em"><mspace mathbackground="black" width="0em" height="1.5em"></mspace></mpadded></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>V</mi><mi>n</mi></msub></mstyle></mtd></mtr></mtable><mo fence="true">]</mo></mrow><mrow><mo fence="true">[</mo><mtable rowspacing="0.15999999999999992em" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><msubsup><mi>V</mi><mn>1</mn><mi>T</mi></msubsup><msubsup><mi>V</mi><mn>2</mn><mi>T</mi></msubsup></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo>⋯</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><msubsup><mi>V</mi><mi>n</mi><mi>T</mi></msubsup></mstyle></mtd></mtr></mtable><mo fence="true">]</mo></mrow></mrow><annotation encoding="application/x-tex">\hat{W}=VV^T= \left[ \begin{matrix} V_{1} \\ V_{2} \\ \vdots \\ V_{n} \\ \end{matrix} \right] \left[ \begin{matrix} V_{1}^{T} V_{2}^{T} & \cdots & V_{n}^{T} \\ \end{matrix} \right]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.9467699999999999em;vertical-align:0"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.9467699999999999em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">W</span></span></span><span style="top:-3.25233em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-.25em">^</span></span></span></span></span></span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.8913309999999999em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.22222em">V</span><span class="mord"><span class="mord mathdefault" style="margin-right:.22222em">V</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.8913309999999999em"><span style="top:-3.113em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:.13889em">T</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:5.459999999999999em;vertical-align:-2.4799999999999995em"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.953005em"><span style="top:-1.3499850000000007em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎣</span></span></span><span style="top:-2.5049850000000005em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎢</span></span></span><span style="top:-3.1059850000000004em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎢</span></span></span><span style="top:-3.7069850000000004em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎢</span></span></span><span style="top:-4.953005em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎡</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:2.4500349999999997em"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.9799999999999995em"><span style="top:-5.8275em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.22222em">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.22222em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span><span style="top:-4.6275em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.22222em">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.22222em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span><span style="top:-2.7674999999999996em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord">⋮</span><span class="mord rule" style="border-right-width:0;border-top-width:1.5em;bottom:0"></span></span></span></span><span style="top:-1.5675000000000006em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.22222em">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.151392em"><span style="top:-2.5500000000000003em;margin-left:-.22222em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:2.4799999999999995em"><span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.953005em"><span style="top:-1.3499850000000007em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎦</span></span></span><span style="top:-2.5049850000000005em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎥</span></span></span><span style="top:-3.1059850000000004em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎥</span></span></span><span style="top:-3.7069850000000004em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎥</span></span></span><span style="top:-4.953005em"><span class="pstrut" style="height:3.1550000000000002em"></span><span class="delimsizinginner delim-size4"><span>⎤</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:2.4500349999999997em"><span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="minner"><span class="mopen delimcenter" style="top:0"><span class="delimsizing size1">[</span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.8506654999999999em"><span style="top:-3.0093345em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.22222em">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.8413309999999999em"><span style="top:-2.4518920000000004em;margin-left:-.22222em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span><span style="top:-3.063em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.13889em">T</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.24810799999999997em"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault" style="margin-right:.22222em">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.8413309999999999em"><span style="top:-2.4518920000000004em;margin-left:-.22222em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span><span style="top:-3.063em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.13889em">T</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.24810799999999997em"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.3506655em"><span></span></span></span></span></span><span class="arraycolsep" style="width:.5em"></span><span class="arraycolsep" style="width:.5em"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.8506654999999999em"><span style="top:-3.0093345em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="minner">⋯</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.3506655em"><span></span></span></span></span></span><span class="arraycolsep" style="width:.5em"></span><span class="arraycolsep" style="width:.5em"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.8506654999999999em"><span style="top:-3.0093345em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.22222em">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.8413309999999999em"><span style="top:-2.4530000000000003em;margin-left:-.22222em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span style="top:-3.063em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.13889em">T</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.247em"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.3506655em"><span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0"><span class="delimsizing size1">]</span></span></span></span></span></span></span></p><p>此时,我们就可以得到FM的表达式:</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mover accent="true"><mi>y</mi><mo>^</mo></mover><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mi>w</mi><mn>0</mn></msub><mo>+</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><msub><mi>w</mi><mi>i</mi></msub><msub><mi>x</mi><mi>i</mi></msub></mrow><mo>+</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><munderover><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mi>i</mi><mo>+</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><mo><</mo><msub><mi>v</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>v</mi><mi>j</mi></msub><mo>></mo><msub><mi>x</mi><mi>i</mi></msub><msub><mi>x</mi><mi>j</mi></msub></mrow></mrow></mrow><annotation encoding="application/x-tex">\hat{y}(x) = w_0+\sum^{n}_{i=1}{w_ix_i}+\sum^{n}_{i=1}{\sum^{n}_{j=i+1}{<v_i,v_j>x_ix_j}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.69444em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-.19444em">^</span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.19444em"><span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.73333em;vertical-align:-.15em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.02691em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:2.929066em;vertical-align:-1.277669em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000002em"><span style="top:-1.872331em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em"><span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:-.02691em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:3.0651740000000007em;vertical-align:-1.4137769999999998em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000002em"><span style="top:-1.872331em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em"><span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000007em"><span style="top:-1.872331em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span><span class="mrel mtight">=</span><span class="mord mathdefault mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.050005em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3000050000000005em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:1.4137769999999998em"><span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mrel"><</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.311664em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.286108em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">></span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.311664em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.286108em"><span></span></span></span></span></span></span></span></span></span></span></span></span></p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo><</mo><msub><mi>v</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>v</mi><mi>j</mi></msub><mo>></mo><mo>=</mo><munderover><mo>∑</mo><mrow><mi>f</mi><mo>=</mo><mn>1</mn></mrow><mi>k</mi></munderover><mrow><msub><mi>v</mi><mrow><mi>i</mi><mi>f</mi></mrow></msub><msub><mi>v</mi><mrow><mi>j</mi><mi>f</mi></mrow></msub></mrow></mrow><annotation encoding="application/x-tex"><v_i,v_j> =\sum^{k}_{f=1}{v_{if}v_{jf}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.5782em;vertical-align:-.0391em"></span><span class="mrel"><</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.8252079999999999em;vertical-align:-.286108em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.311664em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.286108em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">></span></span><span class="base"><span class="strut" style="height:.36687em;vertical-align:0"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:3.274334em;vertical-align:-1.438221em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.836113em"><span style="top:-1.8478869999999998em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.10764em">f</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.0500049999999996em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.300005em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.03148em">k</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:1.438221em"><span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.3361079999999999em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mord mathdefault mtight" style="margin-right:.10764em">f</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.286108em"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.3361079999999999em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span><span class="mord mathdefault mtight" style="margin-right:.10764em">f</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.286108em"><span></span></span></span></span></span></span></span></span></span></span></span></p><blockquote><p>其中,n是特征数量, <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>v</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">v_{i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.58056em;vertical-align:-.15em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31166399999999994em"><span style="top:-2.5500000000000003em;margin-left:-.03588em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>是第<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.65952em;vertical-align:0"></span><span class="mord mathdefault">i</span></span></span></span>维特征的隐向量, <,>代表向量点积。隐向量的长度为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>k</mi><mo><</mo><mo><</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">k<<n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.73354em;vertical-align:-.0391em"></span><span class="mord mathdefault" style="margin-right:.03148em">k</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel"><</span></span><span class="base"><span class="strut" style="height:.5782em;vertical-align:-.0391em"></span><span class="mrel"><</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault">n</span></span></span></span>,包含 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.69444em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.03148em">k</span></span></span></span>个描述特征的因子。</p><p>同时,直观判断上面表达式的复杂度是<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>k</mi><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(kn^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.064108em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.02778em">O</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:.03148em">k</span><span class="mord"><span class="mord mathdefault">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.8141079999999999em"><span style="top:-3.063em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></p></blockquote><p>FM现在被广泛应用的其中一个优点是可以通过数学公式化解,把原来表面上看起来<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>k</mi><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(kn^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.064108em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.02778em">O</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:.03148em">k</span><span class="mord"><span class="mord mathdefault">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.8141079999999999em"><span style="top:-3.063em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>的复杂度降低为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>k</mi><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(kn)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.02778em">O</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:.03148em">k</span><span class="mord mathdefault">n</span><span class="mclose">)</span></span></span></span>。具体的化简过程如下:</p><img src="https://tva1.sinaimg.cn/large/008eGmZEly1go872z7odrj30jk0f2tac.jpg" srcset="/img/loading.gif" lazyload alt="image-20210304213009034" style="zoom:67%"><p>此时FM的公式就完全搞定。接下来一起看一下如何更新权重值。</p><h3 id="23-权值求解"><a class="markdownIt-Anchor" href="#23-权值求解"></a> 2.3 权值求解</h3><p>可以采用随机梯度下降法SGD求解参数(当然其他类似SGD的方法都是可以的):</p><p class="katex-block katex-error" title="ParseError: KaTeX parse error: Undefined control sequence: \ at position 82: … \theta = w_0\\\̲̲x_i, &if\ \thet…">\frac{\partial }{\partial \theta}\hat{y}(X)= \begin{cases} 1, &if\ \theta = w_0\\\ x_i, &if\ \theta = w_i\\\ x_i\sum_{j=1}^n{v_j, fx_j-v_i, fx^2_i}, &if\ \theta =v_{i,f}\\ \end{cases}</p><img src="https://tva1.sinaimg.cn/large/008eGmZEly1go87kku2o0j30si0703z8.jpg" srcset="/img/loading.gif" lazyload alt="image-20210304214706223" style="zoom:50%"><blockquote><p>其中,<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msubsup><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></msubsup><mrow><msub><mi>V</mi><mrow><mi>j</mi><mi>f</mi></mrow></msub><msub><mi>x</mi><mi>j</mi></msub></mrow></mrow><annotation encoding="application/x-tex">\sum^{n}_{j=1}{V_{jf}x_j}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.24011em;vertical-align:-.43581800000000004em"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:-.0000050000000000050004em">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.804292em"><span style="top:-2.40029em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.2029em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.43581800000000004em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:.22222em">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.3361079999999999em"><span style="top:-2.5500000000000003em;margin-left:-.22222em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span><span class="mord mathdefault mtight" style="margin-right:.10764em">f</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.286108em"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.311664em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:.05724em">j</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.286108em"><span></span></span></span></span></span></span></span></span></span></span>和i无关,可以事先求出。计算过程中,每个梯度都可以在O(1)时间内求出,整体的参数更新时间为O(kn)。</p></blockquote><p>经过迭代之后就可以求出结果。</p><h2 id="3-how"><a class="markdownIt-Anchor" href="#3-how"></a> 3. How</h2><blockquote><p>FM怎么使用</p></blockquote><ul><li>使用模式一:通过xlearn搭建模型<ul><li>xlearn官方文档:<a href="https://xlearn-doc-cn.readthedocs.io/en/latest/index.html" target="_blank" rel="noopener">https://xlearn-doc-cn.readthedocs.io/en/latest/index.html</a></li><li>具体举例此处不再赘述,官方文档讲解非常直观。</li></ul></li></ul><p>写在最后,产出本篇文档其实主要是为了后面DeepFM文章做铺垫,所以本文讲解重原理轻应用。</p><hr><h2 id="参考资料"><a class="markdownIt-Anchor" href="#参考资料"></a> 参考资料</h2><p>资料一:<a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.393.8529&rep=rep1&type=pdf" target="_blank" rel="noopener">Factorization Machines</a></p><p>资料二:<a href="https://zhuanlan.zhihu.com/p/58160982" target="_blank" rel="noopener">https://zhuanlan.zhihu.com/p/58160982</a></p><p>资料三:<a href="http://wiki.baidu.com/pages/viewpage.action?pageId=181930125" target="_blank" rel="noopener">http://wiki.baidu.com/pages/viewpage.action?pageId=181930125</a></p>]]></content>
<categories>
<category>机器学习</category>
</categories>
<tags>
<tag>ML</tag>
</tags>
</entry>
<entry>
<title>Python中continue和break的区别</title>
<link href="/python/python/Python%E4%B8%ADcontinue%E5%92%8Cbreak%E7%9A%84%E5%8C%BA%E5%88%AB/"/>
<url>/python/python/Python%E4%B8%ADcontinue%E5%92%8Cbreak%E7%9A%84%E5%8C%BA%E5%88%AB/</url>
<content type="html"><![CDATA[<h1 id="python中continue和break的区别"><a class="markdownIt-Anchor" href="#python中continue和break的区别"></a> Python中continue和break的区别</h1><p>在Python中,可以使用<code>continue</code>语句结束当前循环并进入下一次循环,也可以使用<code>break</code>语句完全退出循环。</p><p><code>continue</code>语句用于在循环体中的某个条件满足时,跳过本次循环的剩余语句,直接进入下一次循环。以下是一个示例代码:</p><figure class="highlight angelscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs angelscript">pythonCopy code<br><span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">1</span>, <span class="hljs-number">11</span>):<br> <span class="hljs-keyword">if</span> i % <span class="hljs-number">2</span> == <span class="hljs-number">0</span>:<br> <span class="hljs-keyword">continue</span> # 如果i是偶数,则跳过本次循环<br> print(i)<br></code></pre></td></tr></table></figure><p>在上面的代码中,当<code>i</code>为偶数时,<code>continue</code>语句将直接跳过本次循环的剩余语句,进入下一次循环。因此,输出结果只包含奇数<code>1、3、5、7、9</code>。</p><p><code>break</code>语句用于在循环体中的某个条件满足时,完全退出循环。以下是一个示例代码:</p><figure class="highlight hsp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs hsp">pythonCopy code<br><span class="hljs-keyword">while</span> True:<br> s = <span class="hljs-keyword">input</span>(<span class="hljs-string">'请输入字符串(输入q退出):'</span>)<br> <span class="hljs-keyword">if</span> s == <span class="hljs-string">'q'</span>:<br> <span class="hljs-keyword">break</span> <span class="hljs-meta"># 如果输入q,则退出循环</span><br> <span class="hljs-keyword">print</span>(s)<br></code></pre></td></tr></table></figure><p>在上面的代码中,使用<code>while</code>语句循环读取用户输入的字符串,当用户输入<code>q</code>时,<code>break</code>语句将退出循环。因此,用户可以通过输入<code>q</code>来结束程序。</p>]]></content>
<categories>
<category>python</category>
</categories>
<tags>
<tag>python</tag>
</tags>
</entry>
<entry>
<title>python中os._exit(),sys.exit(),exit()的区别是什么?</title>
<link href="/python/python/python%20%E4%B8%AD%20os._exit()%EF%BC%8C%20sys.exit()%EF%BC%8C%20exit()%20%E7%9A%84%E5%8C%BA%E5%88%AB%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F/"/>
<url>/python/python/python%20%E4%B8%AD%20os._exit()%EF%BC%8C%20sys.exit()%EF%BC%8C%20exit()%20%E7%9A%84%E5%8C%BA%E5%88%AB%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F/</url>
<content type="html"><![CDATA[<h1 id="python-中-os_exit-sysexit-exit-的区别是什么"><a class="markdownIt-Anchor" href="#python-中-os_exit-sysexit-exit-的区别是什么"></a> python 中 os._exit(), sys.exit(), exit() 的区别是什么?</h1><h2 id="1-sysexitn"><a class="markdownIt-Anchor" href="#1-sysexitn"></a> 1. sys.exit(n)</h2><ul><li><p>退出程序引发SystemExit异常, 可以捕获异常执行些清理工作.</p><ul><li><p>如果有捕获该异常的代码,那么后面的代码还是会执行。</p></li><li><p>一般主程序中使用此退出。</p></li><li><p>举例:</p><ul><li><pre class="highlight"><code class="python"> <span class="hljs-keyword">import</span> sys <span class="hljs-keyword">try</span>: sys.exit(<span class="hljs-number">0</span>) <span class="hljs-keyword">except</span>: print(<span class="hljs-string">"异常捕获"</span>) <span class="hljs-comment"># 可以执行print语句,因为sys.exit()调用出现了异常</span> <!--<span class="hljs-number">0</span>--></code></pre></li></ul></li></ul></li></ul><h2 id="3-exitquit"><a class="markdownIt-Anchor" href="#3-exitquit"></a> 3. exit()/quit()</h2><ul><li><p>跑出SystemExit异常。</p><ul><li>一般在交互式shell中退出时使用。</li></ul></li></ul>]]></content>
<categories>
<category>python</category>
</categories>
<tags>
<tag>python</tag>
</tags>
</entry>
<entry>
<title>markdown常见数学公式</title>
<link href="/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/markdown%E5%B8%B8%E8%A7%81%E6%95%B0%E5%AD%A6%E5%85%AC%E5%BC%8F/"/>
<url>/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9B%B8%E5%85%B3/markdown%E5%B8%B8%E8%A7%81%E6%95%B0%E5%AD%A6%E5%85%AC%E5%BC%8F/</url>
<content type="html"><![CDATA[<h2 id="1行内与独行"><a class="markdownIt-Anchor" href="#1行内与独行"></a> 1.行内与独行</h2><ol><li>行内公式:将公式插入到本行内,符号:<code>$公式内容$</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mi>y</mi><mi>z</mi></mrow><annotation encoding="application/x-tex">xyz</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault">x</span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span></span></li><li>独行公式:将公式插入到新的一行内,并且居中,符号:<code>$$公式内容$$</code>,如:$$xyz$$</li></ol><h2 id="2上标-下标与组合"><a class="markdownIt-Anchor" href="#2上标-下标与组合"></a> 2.上标、下标与组合</h2><ol><li>上标符号,符号:<code>^</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mi>x</mi><mn>4</mn></msup></mrow><annotation encoding="application/x-tex">x^4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.8141079999999999em;vertical-align:0"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.8141079999999999em"><span style="top:-3.063em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">4</span></span></span></span></span></span></span></span></span></span></span></li><li>下标符号,符号:<code>_</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">x_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.58056em;vertical-align:-.15em"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span></li><li>组合符号,符号:<code>{}</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mn>16</mn><mn>8</mn></msub><mi>O</mi><msub><mrow><mn>2</mn><mo>+</mo></mrow><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">{16}_{8}O{2+}_{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord"><span class="mord"><span class="mord">1</span><span class="mord">6</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">8</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:.02778em">O</span><span class="mord"><span class="mord"><span class="mord">2</span><span class="mord">+</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span></li></ol><h2 id="3汉字-字体与格式"><a class="markdownIt-Anchor" href="#3汉字-字体与格式"></a> 3.汉字、字体与格式</h2><ol><li>汉字形式,符号:<code>\mbox{}</code>,如:<span class="katex-error" title="ParseError: KaTeX parse error: Undefined control sequence: \mbox at position 4: V_{\̲m̲b̲o̲x̲{初始}}">V_{\mbox{初始}}</span></li><li>字体控制,符号:<code>\displaystyle</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mstyle scriptlevel="0" displaystyle="true"><mfrac><mrow><mi>x</mi><mo>+</mo><mi>y</mi></mrow><mrow><mi>y</mi><mo>+</mo><mi>z</mi></mrow></mfrac></mstyle></mrow><annotation encoding="application/x-tex">\displaystyle \frac{x+y}{y+z}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.1407700000000003em;vertical-align:-.8804400000000001em"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.2603300000000002em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.8804400000000001em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></li><li>下划线符号,符号:<code>\underline</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><munder accentunder="true"><mrow><mi>x</mi><mo>+</mo><mi>y</mi></mrow><mo stretchy="true">‾</mo></munder></mrow><annotation encoding="application/x-tex">\underline{x+y}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.97777em;vertical-align:-.3944400000000001em"></span><span class="mord underline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.5833299999999999em"><span style="top:-2.6455599999999997em"><span class="pstrut" style="height:3em"></span><span class="underline-line" style="border-bottom-width:.04em"></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.3944400000000001em"><span></span></span></span></span></span></span></span></span></li><li>标签,符号<code>\tag{数字}</code>,如:<span class="katex-error" title="ParseError: KaTeX parse error: \tag works only in display equations">\tag{11}</span></li><li>上大括号,符号:<code>\overbrace{算式}</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mover><mover><mrow><mi>a</mi><mo>+</mo><mi>b</mi><mo>+</mo><mi>c</mi><mo>+</mo><mi>d</mi></mrow><mo stretchy="true">⏞</mo></mover><mn>2.0</mn></mover></mrow><annotation encoding="application/x-tex">\overbrace{a+b+c+d}^{2.0}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.076878em;vertical-align:-.08333em"></span><span class="mord mover"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.9935479999999997em"><span style="top:-3.34244em"><span class="pstrut" style="height:3.34244em"></span><span class="mord mover"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3424399999999999em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mord mathdefault">b</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mord mathdefault">c</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mord mathdefault">d</span></span></span><span class="svg-align" style="top:-3.79444em"><span class="pstrut" style="height:3em"></span><span class="stretchy" style="height:.548em;min-width:1.6em"><span class="brace-left" style="height:.548em"><svg width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMinYMin slice"><path d="M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 5-6 9-10 13-.7 1-7.3 1-20 1H6z"/></svg></span><span class="brace-center" style="height:.548em"><svg width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMidYMin slice"><path d="M200428 334c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z"/></svg></span><span class="brace-right" style="height:.548em"><svg width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMaxYMin slice"><path d="M400000 542l-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z"/></svg></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.08333em"><span></span></span></span></span></span></span><span style="top:-4.88488em"><span class="pstrut" style="height:3.34244em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span><span class="mord mtight">.</span><span class="mord mtight">0</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.08333em"><span></span></span></span></span></span></span></span></span></li><li>下大括号,符号:<code>\underbrace{算式}</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>a</mi><mo>+</mo><munder><munder><mrow><mi>b</mi><mo>+</mo><mi>c</mi></mrow><mo stretchy="true">⏟</mo></munder><mn>1.0</mn></munder><mo>+</mo><mi>d</mi></mrow><annotation encoding="application/x-tex">a+\underbrace{b+c}_{1.0}+d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.66666em;vertical-align:-.08333em"></span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:2.076878em;vertical-align:-1.382438em"></span><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.69444em"><span style="top:-1.617562em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mtight">.</span><span class="mord mtight">0</span></span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.69444em"><span class="svg-align" style="top:-2.26867em"><span class="pstrut" style="height:3em"></span><span class="stretchy" style="height:.548em;min-width:1.6em"><span class="brace-left" style="height:.548em"><svg width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMinYMin slice"><path d="M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z"/></svg></span><span class="brace-center" style="height:.548em"><svg width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMidYMin slice"><path d="M199572 214c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z"/></svg></span><span class="brace-right" style="height:.548em"><svg width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMaxYMin slice"><path d="M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z"/></svg></span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault">b</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mord mathdefault">c</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.73133em"><span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:1.382438em"><span></span></span></span></span></span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.69444em;vertical-align:0"></span><span class="mord mathdefault">d</span></span></span></span></li><li>上位符号,符号:<code>\stacrel{上位符号}{基位符号}</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mover accent="true"><mi>x</mi><mo>⃗</mo></mover><mover><mo><mo>=</mo></mo><mrow><mi mathvariant="normal">d</mi><mi mathvariant="normal">e</mi><mi mathvariant="normal">f</mi></mrow></mover><mrow><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>x</mi><mi>n</mi></msub></mrow></mrow><annotation encoding="application/x-tex">\vec{x}\stackrel{\mathrm{def}}{=}{x_1,\dots,x_n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.152978em;vertical-align:0"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.714em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault">x</span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-.20772em"><span class="overlay" style="height:.714em;width:.471em"><svg width="0.471em" height="0.714em" style="width:.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 53.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 1110.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359c-16-25.333-24-45-24-59z"/></svg></span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel"><span class="mop op-limits"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.152978em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span><span class="mop">=</span></span></span><span style="top:-3.5668699999999998em;margin-left:0"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathrm mtight">d</span><span class="mord mathrm mtight">e</span><span class="mord mathrm mtight" style="margin-right:.07778em">f</span></span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord"><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="minner">…</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.151392em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span></span></li></ol><h2 id="4占位符"><a class="markdownIt-Anchor" href="#4占位符"></a> 4.占位符</h2><ol><li>两个quad空格,符号:<code>\qquad</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mspace width="2em"><mi>y</mi></mrow><annotation encoding="application/x-tex">x \qquad y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:2em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li><li>quad空格,符号:<code>\quad</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mspace width="1em"><mi>y</mi></mrow><annotation encoding="application/x-tex">x \quad y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:1em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li><li>大空格,符号<code>\</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mtext> </mtext><mi>y</mi></mrow><annotation encoding="application/x-tex">x \ y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault">x</span><span class="mspace"> </span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li><li>中空格,符号<code>\:</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>:</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x : y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">:</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li><li>小空格,符号<code>\,</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo separator="true">,</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x , y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li><li>没有空格,符号``,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mi>y</mi></mrow><annotation encoding="application/x-tex">xy</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault">x</span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li><li>紧贴,符号<code>\!</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo stretchy="false">!</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x ! y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.8888799999999999em;vertical-align:-.19444em"></span><span class="mord mathdefault">x</span><span class="mclose">!</span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li></ol><h2 id="5定界符与组合"><a class="markdownIt-Anchor" href="#5定界符与组合"></a> 5.定界符与组合</h2><ol><li>括号,符号:<code>()\big(\big) \Big(\Big) \bigg(\bigg) \Bigg(\Bigg)</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">(</mi><mi mathvariant="normal">)</mi><mo fence="false">(</mo><mo fence="false">)</mo><mo fence="false">(</mo><mo fence="false">)</mo><mo fence="false">(</mo><mo fence="false">)</mo><mo fence="false">(</mo><mo fence="false">)</mo></mrow><annotation encoding="application/x-tex">()\big(\big) \Big(\Big) \bigg(\bigg) \Bigg(\Bigg)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:3.0000299999999998em;vertical-align:-1.25003em"></span><span class="mord cjk_fallback">(</span><span class="mord cjk_fallback">)</span><span class="mord"><span class="delimsizing size1">(</span></span><span class="mord"><span class="delimsizing size1">)</span></span><span class="mord"><span class="delimsizing size2">(</span></span><span class="mord"><span class="delimsizing size2">)</span></span><span class="mord"><span class="delimsizing size3">(</span></span><span class="mord"><span class="delimsizing size3">)</span></span><span class="mord"><span class="delimsizing size4">(</span></span><span class="mord"><span class="delimsizing size4">)</span></span></span></span></span></li><li>中括号,符号:<code>[]</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">[</mo><mi>x</mi><mo>+</mo><mi>y</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">[x+y]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mopen">[</span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mclose">]</span></span></span></span></li><li>大括号,符号:<code>\{ \}</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>+</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">{x+y}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.7777700000000001em;vertical-align:-.19444em"></span><span class="mord"><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></span></li><li>自适应括号,符号:<code>\left \right</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo fence="true">(</mo><mi>x</mi><mo fence="true">)</mo></mrow><annotation encoding="application/x-tex">\left(x\right)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="minner"><span class="mopen delimcenter" style="top:0">(</span><span class="mord mathdefault">x</span><span class="mclose delimcenter" style="top:0">)</span></span></span></span></span>,<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo fence="true">(</mo><mi>x</mi><mrow><mi>y</mi><mi>z</mi></mrow><mo fence="true">)</mo></mrow><annotation encoding="application/x-tex">\left(x{yz}\right)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="minner"><span class="mopen delimcenter" style="top:0">(</span><span class="mord mathdefault">x</span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span><span class="mclose delimcenter" style="top:0">)</span></span></span></span></span></li><li>组合公式,符号:<code>{上位公式 \choose 下位公式}</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mrow><mo fence="true">(</mo><mfrac linethickness="0px"><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow><mi>k</mi></mfrac><mo fence="true">)</mo></mrow><mo>=</mo><mrow><mo fence="true">(</mo><mfrac linethickness="0px"><mi>n</mi><mi>k</mi></mfrac><mo fence="true">)</mo></mrow><mo>+</mo><mrow><mo fence="true">(</mo><mfrac linethickness="0px"><mi>n</mi><mrow><mi>k</mi><mo>−</mo><mn>1</mn></mrow></mfrac><mo fence="true">)</mo></mrow></mrow><annotation encoding="application/x-tex">{n+1 \choose k}={n \choose k}+{n \choose k-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.245118em;vertical-align:-.35001em"></span><span class="mord"><span class="mord"><span class="mopen delimcenter" style="top:0"><span class="delimsizing size1">(</span></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.8951079999999999em"><span style="top:-2.3550000000000004em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.03148em">k</span></span></span></span><span style="top:-3.144em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.345em"><span></span></span></span></span></span><span class="mclose delimcenter" style="top:0"><span class="delimsizing size1">)</span></span></span></span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:1.20001em;vertical-align:-.35001em"></span><span class="mord"><span class="mord"><span class="mopen delimcenter" style="top:0"><span class="delimsizing size1">(</span></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.7453919999999999em"><span style="top:-2.3550000000000004em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.03148em">k</span></span></span></span><span style="top:-3.144em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.345em"><span></span></span></span></span></span><span class="mclose delimcenter" style="top:0"><span class="delimsizing size1">)</span></span></span></span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:1.253331em;vertical-align:-.403331em"></span><span class="mord"><span class="mord"><span class="mopen delimcenter" style="top:0"><span class="delimsizing size1">(</span></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.745392em"><span style="top:-2.355em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.03148em">k</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.144em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.403331em"><span></span></span></span></span></span><span class="mclose delimcenter" style="top:0"><span class="delimsizing size1">)</span></span></span></span></span></span></span></li><li>组合公式,符号:<code>{上位公式 \atop 下位公式}</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mo>∑</mo><mfrac linethickness="0px"><mrow><msub><mi>k</mi><mn>0</mn></msub><mo separator="true">,</mo><msub><mi>k</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>…</mo><mo>></mo><mn>0</mn></mrow><mrow><msub><mi>k</mi><mn>0</mn></msub><mo>+</mo><msub><mi>k</mi><mn>1</mn></msub><mo>+</mo><mo>⋯</mo><mo>=</mo><mi>n</mi></mrow></mfrac></msub><msub><mi>A</mi><msub><mi>k</mi><mn>0</mn></msub></msub><msub><mi>A</mi><msub><mi>k</mi><mn>1</mn></msub></msub><mo>⋯</mo></mrow><annotation encoding="application/x-tex">\sum_{k_0,k_1,\ldots>0 \atop k_0+k_1+\cdots=n}A_{k_0}A_{k_1}\cdots</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.50218em;vertical-align:-.75218em"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:-.0000050000000000050004em">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.3447999999999999em"><span style="top:-2.3448em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.69164em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mopen nulldelimiter sizing reset-size3 size6"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.9880571428571429em"><span style="top:-2.1349714285714283em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.03148em">k</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.3448em"><span style="top:-2.3447999999999998em;margin-left:-.03148em;margin-right:.1em"><span class="pstrut" style="height:2.64444em"></span><span class="mord mtight">0</span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.29964em"><span></span></span></span></span></span></span><span class="mbin mtight">+</span><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.03148em">k</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.3448em"><span style="top:-2.3447999999999998em;margin-left:-.03148em;margin-right:.1em"><span class="pstrut" style="height:2.64444em"></span><span class="mord mtight">1</span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.29964em"><span></span></span></span></span></span></span><span class="mbin mtight">+</span><span class="minner mtight">⋯</span><span class="mrel mtight">=</span><span class="mord mathdefault mtight">n</span></span></span></span><span style="top:-2.9920285714285715em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.03148em">k</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.3448em"><span style="top:-2.3447999999999998em;margin-left:-.03148em;margin-right:.1em"><span class="pstrut" style="height:2.64444em"></span><span class="mord mtight">0</span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.29964em"><span></span></span></span></span></span></span><span class="mpunct mtight">,</span><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.03148em">k</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.3448em"><span style="top:-2.3447999999999998em;margin-left:-.03148em;margin-right:.1em"><span class="pstrut" style="height:2.64444em"></span><span class="mord mtight">1</span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.29964em"><span></span></span></span></span></span></span><span class="mpunct mtight">,</span><span class="minner mtight">…</span><span class="mrel mtight">></span><span class="mord mtight">0</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.5790571428571429em"><span></span></span></span></span></span><span class="mclose nulldelimiter sizing reset-size3 size6"></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.75218em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord mathdefault">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.33610799999999996em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.03148em">k</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31731428571428577em"><span style="top:-2.357em;margin-left:-.03148em;margin-right:.07142857142857144em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.143em"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.2501em"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.33610799999999996em"><span style="top:-2.5500000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.03148em">k</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.31731428571428577em"><span style="top:-2.357em;margin-left:-.03148em;margin-right:.07142857142857144em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.143em"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.2501em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="minner">⋯</span></span></span></span></li></ol><h2 id="6四则运算"><a class="markdownIt-Anchor" href="#6四则运算"></a> 6.四则运算</h2><ol><li>加法运算,符号:<code>+</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>+</mo><mi>y</mi><mo>=</mo><mi>z</mi></mrow><annotation encoding="application/x-tex">x+y=z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.66666em;vertical-align:-.08333em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span></span></li><li>减法运算,符号:<code>-</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>−</mo><mi>y</mi><mo>=</mo><mi>z</mi></mrow><annotation encoding="application/x-tex">x-y=z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.66666em;vertical-align:-.08333em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">−</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span></span></li><li>加减运算,符号:<code>\pm</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>±</mo><mi>y</mi><mo>=</mo><mi>z</mi></mrow><annotation encoding="application/x-tex">x \pm y=z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.66666em;vertical-align:-.08333em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">±</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span></span></li><li>减甲运算,符号:<code>\mp</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>∓</mo><mi>y</mi><mo>=</mo><mi>z</mi></mrow><annotation encoding="application/x-tex">x \mp y=z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.66666em;vertical-align:-.08333em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">∓</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span></span></li><li>乘法运算,符号:<code>\times</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>×</mo><mi>y</mi><mo>=</mo><mi>z</mi></mrow><annotation encoding="application/x-tex">x \times y=z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.66666em;vertical-align:-.08333em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">×</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span></span></li><li>点乘运算,符号:<code>\cdot</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>⋅</mo><mi>y</mi><mo>=</mo><mi>z</mi></mrow><annotation encoding="application/x-tex">x \cdot y=z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.44445em;vertical-align:0"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span></span></li><li>星乘运算,符号:<code>\ast</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>∗</mo><mi>y</mi><mo>=</mo><mi>z</mi></mrow><annotation encoding="application/x-tex">x \ast y=z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.46528em;vertical-align:0"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span></span></li><li>除法运算,符号:<code>\div</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>÷</mo><mi>y</mi><mo>=</mo><mi>z</mi></mrow><annotation encoding="application/x-tex">x \div y=z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.66666em;vertical-align:-.08333em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">÷</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span></span></li><li>斜法运算,符号:<code>/</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mi mathvariant="normal">/</mi><mi>y</mi><mo>=</mo><mi>z</mi></mrow><annotation encoding="application/x-tex">x/y=z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault">x</span><span class="mord">/</span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span></span></li><li>分式表示,符号:<code>\frac{分子}{分母}</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mfrac><mrow><mi>x</mi><mo>+</mo><mi>y</mi></mrow><mrow><mi>y</mi><mo>+</mo><mi>z</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">\frac{x+y}{y+z}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.335547em;vertical-align:-.481108em"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.854439em"><span style="top:-2.6550000000000002em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.03588em">y</span><span class="mbin mtight">+</span><span class="mord mathdefault mtight" style="margin-right:.04398em">z</span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:.04em"></span></span><span style="top:-3.446108em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">x</span><span class="mbin mtight">+</span><span class="mord mathdefault mtight" style="margin-right:.03588em">y</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.481108em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></li><li>分式表示,符号:<code>{分子} \voer {分母}</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mfrac><mrow><mi>x</mi><mo>+</mo><mi>y</mi></mrow><mrow><mi>y</mi><mo>+</mo><mi>z</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">{x+y} \over {y+z}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.335547em;vertical-align:-.481108em"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.854439em"><span style="top:-2.6550000000000002em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.03588em">y</span><span class="mbin mtight">+</span><span class="mord mathdefault mtight" style="margin-right:.04398em">z</span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:.04em"></span></span><span style="top:-3.446108em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">x</span><span class="mbin mtight">+</span><span class="mord mathdefault mtight" style="margin-right:.03588em">y</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.481108em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></li><li>绝对值表示,符号:<code>||</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">∣</mi><mi>x</mi><mo>+</mo><mi>y</mi><mi mathvariant="normal">∣</mi></mrow><annotation encoding="application/x-tex">|x+y|</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord">∣</span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mord">∣</span></span></span></span></li></ol><h2 id="7高级运算"><a class="markdownIt-Anchor" href="#7高级运算"></a> 7.高级运算</h2><ol><li>平均数运算,符号:<code>\overline{算式}</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mover accent="true"><mrow><mi>x</mi><mi>y</mi><mi>z</mi></mrow><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">\overline{xyz}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.825em;vertical-align:-.19444em"></span><span class="mord overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.63056em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault">x</span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span><span style="top:-3.55056em"><span class="pstrut" style="height:3em"></span><span class="overline-line" style="border-bottom-width:.04em"></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.19444em"><span></span></span></span></span></span></span></span></span></li><li>开二次方运算,符号:<code>\sqrt</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msqrt><mi>x</mi></msqrt></mrow><annotation encoding="application/x-tex">\sqrt x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.04em;vertical-align:-.23972em"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.8002800000000001em"><span class="svg-align" style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathdefault" style="padding-left:.833em">x</span></span><span style="top:-2.76028em"><span class="pstrut" style="height:3em"></span><span class="hide-tail" style="min-width:.853em;height:1.08em"><svg width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z M834 80H400000v40H845z"/></svg></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.23972em"><span></span></span></span></span></span></span></span></span></li><li>开方运算,符号:<code>\sqrt[开方数]{被开方数}</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mroot><mrow><mi>x</mi><mo>+</mo><mi>y</mi></mrow><mn>3</mn></mroot></mrow><annotation encoding="application/x-tex">\sqrt[3]{x+y}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.04em;vertical-align:-.26055499999999987em"></span><span class="mord sqrt"><span class="root"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.6335540000000002em"><span style="top:-2.811334em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size6 size1 mtight"><span class="mord mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.7794450000000002em"><span class="svg-align" style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord" style="padding-left:.833em"><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span><span style="top:-2.739445em"><span class="pstrut" style="height:3em"></span><span class="hide-tail" style="min-width:.853em;height:1.08em"><svg width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z M834 80H400000v40H845z"/></svg></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.26055499999999987em"><span></span></span></span></span></span></span></span></span></li><li>对数运算,符号:<code>\log</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>log</mi><mo></mo><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\log(x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mop">lo<span style="margin-right:.01389em">g</span></span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mclose">)</span></span></span></span></li><li>极限运算,符号:<code>\lim</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msubsup><mo><mi>lim</mi><mo></mo></mo><mrow><mi>y</mi><mo>→</mo><mn>0</mn></mrow><mrow><mi>x</mi><mo>→</mo><mi mathvariant="normal">∞</mi></mrow></msubsup><mfrac><mi>x</mi><mi>y</mi></mfrac></mrow><annotation encoding="application/x-tex">\lim^{x \to \infty}_{y \to 0}{\frac{x}{y}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.2298399999999998em;vertical-align:-.481108em"></span><span class="mop"><span class="mop">lim</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.748732em"><span style="top:-2.4530000000000003em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.03588em">y</span><span class="mrel mtight">→</span><span class="mord mtight">0</span></span></span></span><span style="top:-3.1473400000000002em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">x</span><span class="mrel mtight">→</span><span class="mord mtight">∞</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.383108em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.695392em"><span style="top:-2.6550000000000002em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.03588em">y</span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:.04em"></span></span><span style="top:-3.394em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">x</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.481108em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></li><li>极限运算,符号:<code>\displaystyle \lim</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mstyle scriptlevel="0" displaystyle="true"><munderover><mo><mi>lim</mi><mo></mo></mo><mrow><mi>y</mi><mo>→</mo><mn>0</mn></mrow><mrow><mi>x</mi><mo>→</mo><mi mathvariant="normal">∞</mi></mrow></munderover><mfrac><mi>x</mi><mi>y</mi></mfrac></mstyle></mrow><annotation encoding="application/x-tex">\displaystyle \lim^{x \to \infty}_{y \to 0}{\frac{x}{y}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.176272em;vertical-align:-.8804400000000001em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.2958319999999999em"><span style="top:-2.082892em;margin-left:0"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.03588em">y</span><span class="mrel mtight">→</span><span class="mord mtight">0</span></span></span></span><span style="top:-2.7em"><span class="pstrut" style="height:2.7em"></span><span><span class="mop">lim</span></span></span><span style="top:-3.59444em;margin-left:0"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">x</span><span class="mrel mtight">→</span><span class="mord mtight">∞</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.853216em"><span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.10756em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault">x</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.8804400000000001em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></li><li>求和运算,符号:<code>\sum</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msubsup><mo>∑</mo><mrow><mi>y</mi><mo>→</mo><mn>0</mn></mrow><mrow><mi>x</mi><mo>→</mo><mi mathvariant="normal">∞</mi></mrow></msubsup><mfrac><mi>x</mi><mi>y</mi></mfrac></mrow><annotation encoding="application/x-tex">\sum^{x \to \infty}_{y \to 0}{\frac{x}{y}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.2854em;vertical-align:-.481108em"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:-.0000050000000000050004em">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.804292em"><span style="top:-2.40029em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.03588em">y</span><span class="mrel mtight">→</span><span class="mord mtight">0</span></span></span></span><span style="top:-3.2029em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">x</span><span class="mrel mtight">→</span><span class="mord mtight">∞</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.43581800000000004em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.695392em"><span style="top:-2.6550000000000002em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.03588em">y</span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:.04em"></span></span><span style="top:-3.394em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">x</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.481108em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></li><li>求和运算,符号:<code>\displaystyle \sum</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mstyle scriptlevel="0" displaystyle="true"><munderover><mo>∑</mo><mrow><mi>y</mi><mo>→</mo><mn>0</mn></mrow><mrow><mi>x</mi><mo>→</mo><mi mathvariant="normal">∞</mi></mrow></munderover><mfrac><mi>x</mi><mi>y</mi></mfrac></mstyle></mrow><annotation encoding="application/x-tex">\displaystyle \sum^{x \to \infty}_{y \to 0}{\frac{x}{y}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:3.0546180000000005em;vertical-align:-1.403221em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6513970000000002em"><span style="top:-1.8828869999999998em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:.03588em">y</span><span class="mrel mtight">→</span><span class="mord mtight">0</span></span></span></span><span style="top:-3.0500049999999996em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.300005em;margin-left:0"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">x</span><span class="mrel mtight">→</span><span class="mord mtight">∞</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:1.403221em"><span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.10756em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault">x</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.8804400000000001em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></li><li>积分运算,符号:<code>\int</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msubsup><mo>∫</mo><mn>0</mn><mi mathvariant="normal">∞</mi></msubsup><mrow><mi>x</mi><mi>d</mi><mi>x</mi></mrow></mrow><annotation encoding="application/x-tex">\int^{\infty}_{0}{xdx}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.215112em;vertical-align:-.35582em"></span><span class="mop"><span class="mop op-symbol small-op" style="margin-right:.19445em;position:relative;top:-.0005599999999999772em">∫</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.8592920000000001em"><span style="top:-2.34418em;margin-left:-.19445em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">0</span></span></span></span><span style="top:-3.2579000000000002em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">∞</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.35582em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord mathdefault">x</span><span class="mord mathdefault">d</span><span class="mord mathdefault">x</span></span></span></span></span></li><li>积分运算,符号:<code>\displaystyle \int</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mstyle scriptlevel="0" displaystyle="true"><msubsup><mo>∫</mo><mn>0</mn><mi mathvariant="normal">∞</mi></msubsup><mrow><mi>x</mi><mi>d</mi><mi>x</mi></mrow></mstyle></mrow><annotation encoding="application/x-tex">\displaystyle \int^{\infty}_{0}{xdx}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.326242em;vertical-align:-.9119499999999999em"></span><span class="mop"><span class="mop op-symbol large-op" style="margin-right:.44445em;position:relative;top:-.0011249999999999316em">∫</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.414292em"><span style="top:-1.7880500000000001em;margin-left:-.44445em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">0</span></span></span></span><span style="top:-3.8129000000000004em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">∞</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.9119499999999999em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord"><span class="mord mathdefault">x</span><span class="mord mathdefault">d</span><span class="mord mathdefault">x</span></span></span></span></span></li><li>微分运算,符号:<code>\partial</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>x</mi></mrow><mrow><mi mathvariant="normal">∂</mi><mi>y</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">\frac{\partial x}{\partial y}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.3612159999999998em;vertical-align:-.481108em"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.8801079999999999em"><span style="top:-2.6550000000000002em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight" style="margin-right:.05556em">∂</span><span class="mord mathdefault mtight" style="margin-right:.03588em">y</span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:.04em"></span></span><span style="top:-3.394em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight" style="margin-right:.05556em">∂</span><span class="mord mathdefault mtight">x</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.481108em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></li><li>矩阵表示,符号:<code>\begin{matrix} \end{matrix}</code>,如:<span class="katex-error" title="ParseError: KaTeX parse error: Undefined control sequence: \5 at position 38: …1 &2 &\cdots &4\̲5̲ &6 &\cdots &8\…">\left[ \begin{matrix} 1 &2 &\cdots &4\5 &6 &\cdots &8\\vdots &\vdots &\ddots &\vdots\13 &14 &\cdots &16\end{matrix} \right]</span></li></ol><h2 id="8逻辑运算"><a class="markdownIt-Anchor" href="#8逻辑运算"></a> 8.逻辑运算</h2><ol><li>等于运算,符号:<code>=</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>+</mo><mi>y</mi><mo>=</mo><mi>z</mi></mrow><annotation encoding="application/x-tex">x+y=z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.66666em;vertical-align:-.08333em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span></span></li><li>大于运算,符号:<code>></code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>+</mo><mi>y</mi><mo>></mo><mi>z</mi></mrow><annotation encoding="application/x-tex">x+y>z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.66666em;vertical-align:-.08333em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.7335400000000001em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">></span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span></span></li><li>小于运算,符号:<code><</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>+</mo><mi>y</mi><mo><</mo><mi>z</mi></mrow><annotation encoding="application/x-tex">x+y<z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.66666em;vertical-align:-.08333em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.7335400000000001em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel"><</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span></span></li><li>大于等于运算,符号:<code>\geq</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>+</mo><mi>y</mi><mo>≥</mo><mi>z</mi></mrow><annotation encoding="application/x-tex">x+y \geq z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.66666em;vertical-align:-.08333em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.8304100000000001em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span></span></li><li>小于等于运算,符号:<code>\leq</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>+</mo><mi>y</mi><mo>≤</mo><mi>z</mi></mrow><annotation encoding="application/x-tex">x+y \leq z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.66666em;vertical-align:-.08333em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.8304100000000001em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span></span></li><li>不等于运算,符号:<code>\neq</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>+</mo><mi>y</mi><mi mathvariant="normal">≠</mi><mi>z</mi></mrow><annotation encoding="application/x-tex">x+y \neq z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.66666em;vertical-align:-.08333em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.8888799999999999em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel"><span class="mrel"><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.69444em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="rlap"><span class="strut" style="height:.8888799999999999em;vertical-align:-.19444em"></span><span class="inner"><span class="mrel"></span></span><span class="fix"></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.19444em"><span></span></span></span></span></span></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span></span></li><li>不大于等于运算,符号:<code>\ngeq</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>+</mo><mi>y</mi><mo>≱</mo><mi>z</mi></mrow><annotation encoding="application/x-tex">x+y \ngeq z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.66666em;vertical-align:-.08333em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:1.09657em;vertical-align:-.30274em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel amsrm">≱</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span></span></li><li>不大于等于运算,符号:<code>\not\geq</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>+</mo><mi>y</mi><mo>≱</mo><mi>z</mi></mrow><annotation encoding="application/x-tex">x+y \not\geq z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.66666em;vertical-align:-.08333em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.8888799999999999em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel"><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.69444em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="rlap"><span class="strut" style="height:.8888799999999999em;vertical-align:-.19444em"></span><span class="inner"><span class="mrel"></span></span><span class="fix"></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.19444em"><span></span></span></span></span></span></span></span><span class="base"><span class="strut" style="height:.7719400000000001em;vertical-align:-.13597em"></span><span class="mrel">≥</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span></span></li><li>不小于等于运算,符号:<code>\nleq</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>+</mo><mi>y</mi><mo>≰</mo><mi>z</mi></mrow><annotation encoding="application/x-tex">x+y \nleq z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.66666em;vertical-align:-.08333em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:1.09657em;vertical-align:-.30274em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel amsrm">≰</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span></span></li><li>不小于等于运算,符号:<code>\not\leq</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>+</mo><mi>y</mi><mo>≰</mo><mi>z</mi></mrow><annotation encoding="application/x-tex">x+y \not\leq z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.66666em;vertical-align:-.08333em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.8888799999999999em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel"><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.69444em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="rlap"><span class="strut" style="height:.8888799999999999em;vertical-align:-.19444em"></span><span class="inner"><span class="mrel"></span></span><span class="fix"></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.19444em"><span></span></span></span></span></span></span></span><span class="base"><span class="strut" style="height:.7719400000000001em;vertical-align:-.13597em"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span></span></li><li>约等于运算,符号:<code>\approx</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>+</mo><mi>y</mi><mo>≈</mo><mi>z</mi></mrow><annotation encoding="application/x-tex">x+y \approx z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.66666em;vertical-align:-.08333em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.6775599999999999em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span></span></li><li>恒定等于运算,符号:<code>\equiv</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>+</mo><mi>y</mi><mo>≡</mo><mi>z</mi></mrow><annotation encoding="application/x-tex">x+y \equiv z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.66666em;vertical-align:-.08333em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.65819em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">≡</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathdefault" style="margin-right:.04398em">z</span></span></span></span></li></ol><h2 id="9集合运算"><a class="markdownIt-Anchor" href="#9集合运算"></a> 9.集合运算</h2><ol><li>属于运算,符号:<code>\in</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>∈</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x \in y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.5782em;vertical-align:-.0391em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li><li>不属于运算,符号:<code>\notin</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mi mathvariant="normal">∉</mi><mi>y</mi></mrow><annotation encoding="application/x-tex">x \notin y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel"><span class="mord"><span class="mrel">∈</span></span><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.75em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="llap"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="inner"><span class="mord"><span class="mord">/</span><span class="mspace" style="margin-right:.05555555555555555em"></span></span></span><span class="fix"></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.25em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li><li>不属于运算,符号:<code>\not\in</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>∉</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x \not\in y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.8888799999999999em;vertical-align:-.19444em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel"><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.69444em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="rlap"><span class="strut" style="height:.8888799999999999em;vertical-align:-.19444em"></span><span class="inner"><span class="mrel"></span></span><span class="fix"></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.19444em"><span></span></span></span></span></span></span></span><span class="base"><span class="strut" style="height:.5782em;vertical-align:-.0391em"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li><li>子集运算,符号:<code>\subset</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>⊂</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x \subset y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.5782em;vertical-align:-.0391em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">⊂</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li><li>子集运算,符号:<code>\supset</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>⊃</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x \supset y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.5782em;vertical-align:-.0391em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">⊃</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li><li>真子集运算,符号:<code>\subseteq</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>⊆</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x \subseteq y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.7719400000000001em;vertical-align:-.13597em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">⊆</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li><li>非真子集运算,符号:<code>\subsetneq</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>⊊</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x \subsetneq y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.7719400000000001em;vertical-align:-.13597em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel amsrm">⊊</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li><li>真子集运算,符号:<code>\supseteq</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>⊇</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x \supseteq y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.7719400000000001em;vertical-align:-.13597em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">⊇</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li><li>非真子集运算,符号:<code>\supsetneq</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>⊋</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x \supsetneq y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.7719400000000001em;vertical-align:-.13597em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel amsrm">⊋</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li><li>非子集运算,符号:<code>\not\subset</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>⊄</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x \not\subset y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.8888799999999999em;vertical-align:-.19444em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel"><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.69444em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="rlap"><span class="strut" style="height:.8888799999999999em;vertical-align:-.19444em"></span><span class="inner"><span class="mrel"></span></span><span class="fix"></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.19444em"><span></span></span></span></span></span></span></span><span class="base"><span class="strut" style="height:.5782em;vertical-align:-.0391em"></span><span class="mrel">⊂</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li><li>非子集运算,符号:<code>\not\supset</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>⊅</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x \not\supset y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.8888799999999999em;vertical-align:-.19444em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel"><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.69444em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="rlap"><span class="strut" style="height:.8888799999999999em;vertical-align:-.19444em"></span><span class="inner"><span class="mrel"></span></span><span class="fix"></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.19444em"><span></span></span></span></span></span></span></span><span class="base"><span class="strut" style="height:.5782em;vertical-align:-.0391em"></span><span class="mrel">⊃</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li><li>并集运算,符号:<code>\cup</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>∪</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x \cup y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.55556em;vertical-align:0"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">∪</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li><li>交集运算,符号:<code>\cap</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>∩</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x \cap y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.55556em;vertical-align:0"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">∩</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li><li>差集运算,符号:<code>\setminus</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>∖</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x \setminus y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">∖</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li><li>同或运算,符号:<code>\bigodot</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>⨀</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x \bigodot y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.00001em;vertical-align:-.25001em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mop op-symbol small-op" style="position:relative;top:-.0000050000000000050004em">⨀</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li><li>同与运算,符号:<code>\bigotimes</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>⨂</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x \bigotimes y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.00001em;vertical-align:-.25001em"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mop op-symbol small-op" style="position:relative;top:-.0000050000000000050004em">⨂</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord mathdefault" style="margin-right:.03588em">y</span></span></span></span></li><li>实数集合,符号:<code>\mathbb{R}</code>,如:<code>\mathbb{R}</code></li><li>自然数集合,符号:<code>\mathbb{Z}</code>,如:<code>\mathbb{Z}</code></li><li>空集,符号:<code>\emptyset</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">∅</mi></mrow><annotation encoding="application/x-tex">\emptyset</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.80556em;vertical-align:-.05556em"></span><span class="mord">∅</span></span></span></span></li></ol><h2 id="10数学符号"><a class="markdownIt-Anchor" href="#10数学符号"></a> 10.数学符号</h2><ol><li>无穷,符号:<code>\infty</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">∞</mi></mrow><annotation encoding="application/x-tex">\infty</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord">∞</span></span></span></span></li><li>虚数,符号:<code>\imath</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>ı</mi></mrow><annotation encoding="application/x-tex">\imath</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.43056em;vertical-align:0"></span><span class="mord mathit latin_fallback">ı</span></span></span></span></li><li>虚数,符号:<code>\jmath</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>ȷ</mi></mrow><annotation encoding="application/x-tex">\jmath</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.625em;vertical-align:-.19444em"></span><span class="mord mathit latin_fallback">ȷ</span></span></span></span></li><li>数学符号,符号<code>\hat{a}</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mover accent="true"><mi>a</mi><mo>^</mo></mover></mrow><annotation encoding="application/x-tex">\hat{a}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.69444em;vertical-align:0"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.69444em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault">a</span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-.25em">^</span></span></span></span></span></span></span></span></span></li><li>数学符号,符号<code>\check{a}</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mover accent="true"><mi>a</mi><mo>ˇ</mo></mover></mrow><annotation encoding="application/x-tex">\check{a}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.62847em;vertical-align:0"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.62847em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault">a</span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-.25em">ˇ</span></span></span></span></span></span></span></span></span></li><li>数学符号,符号<code>\breve{a}</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mover accent="true"><mi>a</mi><mo>˘</mo></mover></mrow><annotation encoding="application/x-tex">\breve{a}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.69444em;vertical-align:0"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.69444em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault">a</span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-.25em">˘</span></span></span></span></span></span></span></span></span></li><li>数学符号,符号<code>\tilde{a}</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mover accent="true"><mi>a</mi><mo>~</mo></mover></mrow><annotation encoding="application/x-tex">\tilde{a}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.6678599999999999em;vertical-align:0"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.6678599999999999em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault">a</span></span></span><span style="top:-3.35em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-.25em">~</span></span></span></span></span></span></span></span></span></li><li>数学符号,符号<code>\bar{a}</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mover accent="true"><mi>a</mi><mo>ˉ</mo></mover></mrow><annotation encoding="application/x-tex">\bar{a}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.56778em;vertical-align:0"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.56778em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault">a</span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-.25em">ˉ</span></span></span></span></span></span></span></span></span></li><li>矢量符号,符号<code>\vec{a}</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mover accent="true"><mi>a</mi><mo>⃗</mo></mover></mrow><annotation encoding="application/x-tex">\vec{a}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.714em;vertical-align:0"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.714em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault">a</span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-.2355em"><span class="overlay" style="height:.714em;width:.471em"><svg width="0.471em" height="0.714em" style="width:.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 53.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 1110.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359c-16-25.333-24-45-24-59z"/></svg></span></span></span></span></span></span></span></span></span></span></li><li>数学符号,符号<code>\acute{a}</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mover accent="true"><mi>a</mi><mo>ˊ</mo></mover></mrow><annotation encoding="application/x-tex">\acute{a}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.69444em;vertical-align:0"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.69444em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault">a</span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-.25em">ˊ</span></span></span></span></span></span></span></span></span></li><li>数学符号,符号<code>\grave{a}</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mover accent="true"><mi>a</mi><mo>ˋ</mo></mover></mrow><annotation encoding="application/x-tex">\grave{a}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.69444em;vertical-align:0"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.69444em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault">a</span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-.25em">ˋ</span></span></span></span></span></span></span></span></span></li><li>数学符号,符号<code>\mathring{a}</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mover accent="true"><mi>a</mi><mo>˚</mo></mover></mrow><annotation encoding="application/x-tex">\mathring{a}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.69444em;vertical-align:0"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.69444em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault">a</span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-.375em">˚</span></span></span></span></span></span></span></span></span></li><li>一阶导数符号,符号<code>\dot{a}</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mover accent="true"><mi>a</mi><mo>˙</mo></mover></mrow><annotation encoding="application/x-tex">\dot{a}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.66786em;vertical-align:0"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.66786em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault">a</span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-.13889em">˙</span></span></span></span></span></span></span></span></span></li><li>二阶导数符号,符号<code>\ddot{a}</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mover accent="true"><mi>a</mi><mo>¨</mo></mover></mrow><annotation encoding="application/x-tex">\ddot{a}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.66786em;vertical-align:0"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.66786em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathdefault">a</span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-.25em">¨</span></span></span></span></span></span></span></span></span></li><li>上箭头,符号:<code>\uparrow</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo>↑</mo></mrow><annotation encoding="application/x-tex">\uparrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.8888799999999999em;vertical-align:-.19444em"></span><span class="mrel">↑</span></span></span></span></li><li>上箭头,符号:<code>\Uparrow</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo>⇑</mo></mrow><annotation encoding="application/x-tex">\Uparrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.8888799999999999em;vertical-align:-.19444em"></span><span class="mrel">⇑</span></span></span></span></li><li>下箭头,符号:<code>\downarrow</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo>↓</mo></mrow><annotation encoding="application/x-tex">\downarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.8888799999999999em;vertical-align:-.19444em"></span><span class="mrel">↓</span></span></span></span></li><li>下箭头,符号:<code>\Downarrow</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo>⇓</mo></mrow><annotation encoding="application/x-tex">\Downarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.8888799999999999em;vertical-align:-.19444em"></span><span class="mrel">⇓</span></span></span></span></li><li>左箭头,符号:<code>\leftarrow</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo>←</mo></mrow><annotation encoding="application/x-tex">\leftarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.36687em;vertical-align:0"></span><span class="mrel">←</span></span></span></span></li><li>左箭头,符号:<code>\Leftarrow</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo>⇐</mo></mrow><annotation encoding="application/x-tex">\Leftarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.36687em;vertical-align:0"></span><span class="mrel">⇐</span></span></span></span></li><li>右箭头,符号:<code>\rightarrow</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo>→</mo></mrow><annotation encoding="application/x-tex">\rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.36687em;vertical-align:0"></span><span class="mrel">→</span></span></span></span></li><li>右箭头,符号:<code>\Rightarrow</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo>⇒</mo></mrow><annotation encoding="application/x-tex">\Rightarrow</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.36687em;vertical-align:0"></span><span class="mrel">⇒</span></span></span></span></li><li>底端对齐的省略号,符号:<code>\ldots</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>1</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">1,2,\ldots,n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.8388800000000001em;vertical-align:-.19444em"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="minner">…</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord mathdefault">n</span></span></span></span></li><li>中线对齐的省略号,符号:<code>\cdots</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msubsup><mi>x</mi><mn>1</mn><mn>2</mn></msubsup><mo>+</mo><msubsup><mi>x</mi><mn>2</mn><mn>2</mn></msubsup><mo>+</mo><mo>⋯</mo><mo>+</mo><msubsup><mi>x</mi><mi>n</mi><mn>2</mn></msubsup></mrow><annotation encoding="application/x-tex">x_1^2 + x_2^2 + \cdots + x_n^2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0622159999999998em;vertical-align:-.24810799999999997em"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.8141079999999999em"><span style="top:-2.4518920000000004em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span><span style="top:-3.063em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.24810799999999997em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:1.0622159999999998em;vertical-align:-.24810799999999997em"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.8141079999999999em"><span style="top:-2.4518920000000004em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span><span style="top:-3.063em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.24810799999999997em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.66666em;vertical-align:-.08333em"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:1.061108em;vertical-align:-.247em"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.8141079999999999em"><span style="top:-2.4530000000000003em;margin-left:0;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span><span style="top:-3.063em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.247em"><span></span></span></span></span></span></span></span></span></span></li><li>竖直对齐的省略号,符号:<code>\vdots</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">⋮</mi><mpadded height="+0em" voffset="0em"><mspace mathbackground="black" width="0em" height="1.5em"></mspace></mpadded></mrow><annotation encoding="application/x-tex">\vdots</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.53em;vertical-align:-.03em"></span><span class="mord"><span class="mord">⋮</span><span class="mord rule" style="border-right-width:0;border-top-width:1.5em;bottom:0"></span></span></span></span></span></li><li>斜对齐的省略号,符号:<code>\ddots</code>,如:<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo>⋱</mo></mrow><annotation encoding="application/x-tex">\ddots</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.82em;vertical-align:0"></span><span class="minner">⋱</span></span></span></span></li></ol><h2 id="11希腊字母"><a class="markdownIt-Anchor" href="#11希腊字母"></a> 11.希腊字母</h2><table><thead><tr><th>字母</th><th>实现</th><th>字母</th><th>实现</th></tr></thead><tbody><tr><td>A</td><td><code>A</code></td><td>α</td><td><code>\alhpa</code></td></tr><tr><td>B</td><td><code>B</code></td><td>β</td><td><code>\beta</code></td></tr><tr><td>Γ</td><td><code>\Gamma</code></td><td>γ</td><td><code>\gamma</code></td></tr><tr><td>Δ</td><td><code>\Delta</code></td><td>δ</td><td><code>\delta</code></td></tr><tr><td>E</td><td><code>E</code></td><td>ϵ</td><td><code>\epsilon</code></td></tr><tr><td>Z</td><td><code>Z</code></td><td>ζ</td><td><code>\zeta</code></td></tr><tr><td>H</td><td><code>H</code></td><td>η</td><td><code>\eta</code></td></tr><tr><td>Θ</td><td><code>\Theta</code></td><td>θ</td><td><code>\theta</code></td></tr><tr><td>I</td><td><code>I</code></td><td>ι</td><td><code>\iota</code></td></tr><tr><td>K</td><td><code>K</code></td><td>κ</td><td><code>\kappa</code></td></tr><tr><td>Λ</td><td><code>\Lambda</code></td><td>λ</td><td><code>\lambda</code></td></tr><tr><td>M</td><td><code>M</code></td><td>μ</td><td><code>\mu</code></td></tr><tr><td>N</td><td><code>N</code></td><td>ν</td><td><code>\nu</code></td></tr><tr><td>Ξ</td><td><code>\Xi</code></td><td>ξ</td><td><code>\xi</code></td></tr><tr><td>O</td><td><code>O</code></td><td>ο</td><td><code>\omicron</code></td></tr><tr><td>Π</td><td><code>\Pi</code></td><td>π</td><td><code>\pi</code></td></tr><tr><td>P</td><td><code>P</code></td><td>ρ</td><td><code>\rho</code></td></tr><tr><td>Σ</td><td><code>\Sigma</code></td><td>σ</td><td><code>\sigma</code></td></tr><tr><td>T</td><td><code>T</code></td><td>τ</td><td><code>\tau</code></td></tr><tr><td>Υ</td><td><code>\Upsilon</code></td><td>υ</td><td><code>\upsilon</code></td></tr><tr><td>Φ</td><td><code>\Phi</code></td><td>ϕ</td><td><code>\phi</code></td></tr><tr><td>X</td><td><code>X</code></td><td>χ</td><td><code>\chi</code></td></tr><tr><td>Ψ</td><td><code>\Psi</code></td><td>ψ</td><td><code>\psi</code></td></tr><tr><td>Ω</td><td><code>\v</code></td><td>ω</td><td><code>\omega</code></td></tr></tbody></table>]]></content>
<categories>
<category>计算机相关</category>
</categories>
<tags>
<tag>Linux</tag>
</tags>
</entry>
<entry>
<title>朗格朗日乘子法</title>
<link href="/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ML/%E5%88%9D%E8%AF%86-%E6%9C%97%E6%A0%BC%E6%9C%97%E6%97%A5%E4%B9%98%E5%AD%90%E6%B3%95/"/>
<url>/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ML/%E5%88%9D%E8%AF%86-%E6%9C%97%E6%A0%BC%E6%9C%97%E6%97%A5%E4%B9%98%E5%AD%90%E6%B3%95/</url>
<content type="html"><![CDATA[<h1 id="朗格朗日乘子法"><a class="markdownIt-Anchor" href="#朗格朗日乘子法"></a> 朗格朗日乘子法</h1><p>拉格朗日乘子法 (Lagrange multipliers)是一种寻找多元函数在一组约束下的极值的方法.通过引入拉格朗日乘子,可将有 d 个变量与 k 个约束条件的最优化问题转化为具有 d + k 个变量的无约束优化问题求解。</p><p>本文希望通过一个直观简单的例子尽力解释拉格朗日乘子法和KKT条件的原理。</p><hr><p>以包含一个变量一个约束的简单优化问题为例。</p><p>如图所示,我们的目标函数是<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><mn>4</mn><mi>x</mi><mi mathvariant="normal">−</mi><mn>1</mn></mrow><annotation encoding="application/x-tex">f(x)=x^2+4x−1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.10764em">f</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.897438em;vertical-align:-.08333em"></span><span class="mord"><span class="mord mathdefault">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.8141079999999999em"><span style="top:-3.063em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:.72777em;vertical-align:-.08333em"></span><span class="mord">4</span><span class="mord mathdefault">x</span><span class="mord">−</span><span class="mord">1</span></span></span></span>,讨论两种约束条件𝑔(𝑥)g(x):</p><ol><li><p>在满足x≤−1 约束条件下求目标函数的最小值;</p></li><li><p>在满足 x≥−1约束条件g(x)下求目标函数的最小值。</p></li></ol><hr><img src="https://tva1.sinaimg.cn/large/006tNbRwly1gaof2vfx7hj30a605ajrg.jpg" srcset="/img/loading.gif" lazyload alt="image-20200107233114156" style="zoom:67%"><p><img src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly90dmExLnNpbmFpbWcuY24vbGFyZ2UvMDA2dE5iUndseTFnYW9mMHV4eHJ2ajMwOXowNnpnbG4uanBn?x-oss-process=image/format,png" srcset="/img/loading.gif" lazyload alt="img"></p><p>我们可以直观的从图中得到,</p><ul><li>对于约束 1) 使目标值f(x)最小的最优解是x=−2;</li><li>对于约束 2) 使目标值f(x)最小的最优解是x=−1。</li></ul><hr><p>下面我们用拉格朗日乘子来求解这个最优解。</p><p>当没有约束的时候,我们可以直接令目标函数的导数为0,求最优值。</p><p>可现在有约束,那怎么边考虑约束边求目标函数最优值呢?</p><ul><li>最直观的办法是把约束放进目标函数里,由于本例中只有一个约束,所以引入一个朗格朗日乘子λ,构造一个新的函数,拉格朗日函数h(x),<ul><li><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>h</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>+</mo><mi>λ</mi><mi>g</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">h(x)=f(x)+λg(x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault">h</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.10764em">f</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault">λ</span><span class="mord mathdefault" style="margin-right:.03588em">g</span><span class="mopen">(</span><span class="mord mathdefault">x</span><span class="mclose">)</span></span></span></span></span></p></li></ul></li></ul><p>该拉格朗日函数h(x)最优解可能在g(x)<0区域中,或者在边界g(x)=0上,下面具体分析这两种情况,</p><ul><li>当g(x)<0时,也就是最优解在g(x)<0区域中, 对应约束1) x≤−1的情况。此时约束对求目标函数最小值不起作用,等价于λ=0,直接通过条件∇𝑓(𝑥∗)=0,得拉格朗日函数h(x)最优解x=−2。</li><li>当g(x)=0时,也就是最优解在边界g(x)=0上,对应约束1) x≥−1的情况。此时不等式约束转换为等式约束,也就是在λ>0、约束起作用的情况下,通过求∇𝑓(𝑥∗)+𝜆∇𝑔(𝑥∗)=0,得拉格朗日函数h(x)最优解x=−1。</li></ul><p>所以整合这两种情况,必须满足λg(x)=0</p><p>因此约束g(x)最小化f(x)的优化问题,可通过引入拉格朗日因子转化为在如下约束下,最小化拉格朗日函数h(x),</p><img src="https://tva1.sinaimg.cn/large/006tNbRwly1gaofca0czmj308004it8o.jpg" srcset="/img/loading.gif" lazyload alt="image-20200107234016388" style="zoom:50%"><p>上述约束条件成为KKT条件。</p><p>该KKT条件可扩展到多个等式约束和不等式约束的优化问题。</p>]]></content>
<categories>
<category>机器学习</category>
</categories>
<tags>
<tag>ML</tag>
</tags>
</entry>
<entry>
<title>分类中解决类别不平衡问题</title>
<link href="/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ML/%E5%88%86%E7%B1%BB%E4%B8%AD%E8%A7%A3%E5%86%B3%E7%B1%BB%E5%88%AB%E4%B8%8D%E5%B9%B3%E8%A1%A1%E9%97%AE%E9%A2%98/"/>
<url>/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ML/%E5%88%86%E7%B1%BB%E4%B8%AD%E8%A7%A3%E5%86%B3%E7%B1%BB%E5%88%AB%E4%B8%8D%E5%B9%B3%E8%A1%A1%E9%97%AE%E9%A2%98/</url>
<content type="html"><![CDATA[<h1 id="分类中解决类别不平衡问题"><a class="markdownIt-Anchor" href="#分类中解决类别不平衡问题"></a> 分类中解决类别不平衡问题</h1><hr><p>在现实环境中,采集的数据(建模样本)往往是比例失衡的。比如网贷数据,逾期人数的比例是极低的(千分之几的比例);奢侈品消费人群鉴定等。</p><h2 id="1类别不平衡数据集基本介绍"><a class="markdownIt-Anchor" href="#1类别不平衡数据集基本介绍"></a> 1.类别不平衡数据集基本介绍</h2><p>在这一节中,我们一起看一下,当遇到数据类别不平衡的时候,我们该如何处理。在Python中,有Imblearn包,它就是为处理数据比例失衡而生的。</p><ul><li>安装Imblearn包</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">pip3 install imbalanced-learn<br></code></pre></td></tr></table></figure><p>第三方包链接:<a href="https://pypi.org/project/imbalanced-learn/" target="_blank" rel="noopener">https://pypi.org/project/imbalanced-learn/</a></p><ul><li>创造数据集</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">from</span> sklearn.datasets <span class="hljs-keyword">import</span> make_classification<br><span class="hljs-keyword">import</span> matplotlib.pyplot <span class="hljs-keyword">as</span> plt<br><br><span class="hljs-comment">#使用make_classification生成样本数据</span><br>X, y = make_classification(n_samples=<span class="hljs-number">5000</span>, <br> n_features=<span class="hljs-number">2</span>, <span class="hljs-comment"># 特征个数= n_informative() + n_redundant + n_repeated </span><br> n_informative=<span class="hljs-number">2</span>, <span class="hljs-comment"># 多信息特征的个数</span><br> n_redundant=<span class="hljs-number">0</span>, <span class="hljs-comment"># 冗余信息,informative特征的随机线性组合</span><br> n_repeated=<span class="hljs-number">0</span>, <span class="hljs-comment"># 重复信息,随机提取n_informative和n_redundant 特征 </span><br> n_classes=<span class="hljs-number">3</span>, <span class="hljs-comment"># 分类类别</span><br> n_clusters_per_class=<span class="hljs-number">1</span>, <span class="hljs-comment"># 某一个类别是由几个cluster构成的</span><br> weights=[<span class="hljs-number">0.01</span>, <span class="hljs-number">0.05</span>, <span class="hljs-number">0.94</span>], <span class="hljs-comment"># 列表类型,权重比</span><br> random_state=<span class="hljs-number">0</span>)<br></code></pre></td></tr></table></figure><ul><li>查看各个标签的样本</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment">#查看各个标签的样本量</span><br><span class="hljs-keyword">from</span> collections <span class="hljs-keyword">import</span> Counter<br>Counter(y)<br><br><span class="hljs-comment"># Counter({2: 4674, 1: 262, 0: 64})</span><br></code></pre></td></tr></table></figure><ul><li>数据集可视化</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># 数据集可视化</span><br>plt.scatter(X[:, <span class="hljs-number">0</span>], X[:, <span class="hljs-number">1</span>], c=y)<br>plt.show()<br></code></pre></td></tr></table></figure><img src="https://tva1.sinaimg.cn/large/006tNbRwly1gae1okhof5j30l20dojth.jpg" srcset="/img/loading.gif" lazyload alt="image-20191230001202944" style="zoom:50%"><p>可以看出样本的三个标签中,1,2的样本量极少,样本失衡。下面使用imblearn进行过采样。</p><p>接下来,我们就要基于以上数据,进行相应的处理。</p><hr><p>关于类别不平衡的问题,主要有两种处理方式:</p><ul><li>过采样方法<ul><li>增加数量较少那一类样本的数量,使得正负样本比例均衡。</li></ul></li><li>欠采样方法<ul><li>减少数量较多那一类样本的数量,使得正负样本比例均衡。</li></ul></li></ul><h2 id="2解决类别不平衡数据方法介绍"><a class="markdownIt-Anchor" href="#2解决类别不平衡数据方法介绍"></a> 2.解决类别不平衡数据方法介绍</h2><h3 id="21-过采样方法"><a class="markdownIt-Anchor" href="#21-过采样方法"></a> 2.1 过采样方法</h3><h4 id="211-什么是过采样方法"><a class="markdownIt-Anchor" href="#211-什么是过采样方法"></a> 2.1.1 <strong>什么是过采样方法</strong></h4><p>对训练集里的少数类进行“过采样”(oversampling),<strong>即增加一些少数类样本使得正、反例数目接近,然后再进行学习。</strong></p><h4 id="212-随机过采样方法"><a class="markdownIt-Anchor" href="#212-随机过采样方法"></a> 2.1.2 <strong>随机过采样方法</strong></h4><p>随机过采样是在少数类 <img src="https://www.zhihu.com/equation?tex=S_%7Bmin%7D" srcset="/img/loading.gif" lazyload alt="[公式]"> 中随机选择一些样本,然后**通过复制所选择的样本生成样本集 <img src="https://www.zhihu.com/equation?tex=E" srcset="/img/loading.gif" lazyload alt="[公式]"> ,**将它们添加到 <img src="https://www.zhihu.com/equation?tex=S_%7Bmin%7D" srcset="/img/loading.gif" lazyload alt="[公式]"> 中来扩大原始数据集从而得到新的少数类集合 <img src="https://www.zhihu.com/equation?tex=S_%7Bnew-min%7D" srcset="/img/loading.gif" lazyload alt="[公式]"> 。新的数据集 <img src="https://www.zhihu.com/equation?tex=S_%7Bnew-min%7D%3DS_%7Bmin%7D%2BE" srcset="/img/loading.gif" lazyload alt="[公式]"> 。</p><ul><li>通过代码实现随机过采样方法:</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># 使用imblearn进行随机过采样</span><br><span class="hljs-keyword">from</span> imblearn.over_sampling <span class="hljs-keyword">import</span> RandomOverSampler<br>ros = RandomOverSampler(random_state=<span class="hljs-number">0</span>)<br>X_resampled, y_resampled = ros.fit_resample(X, y)<br><span class="hljs-comment">#查看结果</span><br>Counter(y_resampled)<br> <br><span class="hljs-comment">#过采样后样本结果</span><br><span class="hljs-comment"># Counter({2: 4674, 1: 4674, 0: 4674})</span><br><br><span class="hljs-comment"># 数据集可视化</span><br>plt.scatter(X_resampled[:, <span class="hljs-number">0</span>], X_resampled[:, <span class="hljs-number">1</span>], c=y_resampled)<br>plt.show()<br></code></pre></td></tr></table></figure><img src="https://tva1.sinaimg.cn/large/006tNbRwly1gae1va7kupj30la0e0gnf.jpg" srcset="/img/loading.gif" lazyload alt="image-20191230001829494" style="zoom:50%"><hr><ul><li>缺点:<ul><li>对于随机过采样,由于需要对少数类样本进行复制来扩大数据集,<strong>造成模型训练复杂度加大</strong>。</li><li>另一方面也容易<strong>造成模型的过拟合问题</strong>,因为随机过采样是简单的对初始样本进行复制采样,这就使得学习器学得的规则过于具体化,不利于学习器的泛化性能,造成过拟合问题。</li></ul></li></ul><p>为了解决随机过采样中造成模型过拟合问题,又能保证实现数据集均衡的目的,出现了过采样法代表性的算法SMOTE算法。</p><h4 id="213-过采样代表性算法-smote"><a class="markdownIt-Anchor" href="#213-过采样代表性算法-smote"></a> 2.1.3 <strong>过采样代表性算法-SMOTE</strong></h4><p>SMOTE全称是Synthetic Minority Oversampling即合成少数类过采样技术。</p><p>SMOTE算法是对随机过采样方法的一个改进算法,由于随机过采样方法是直接对少数类进行重采用,会使训练集中有很多重复的样本,容易造成产生的模型过拟合问题。而SMOTE算法的基本思想:</p><blockquote><p>对每个少数类样本 <img src="https://www.zhihu.com/equation?tex=x_%7Bi%7D" srcset="/img/loading.gif" lazyload alt="[公式]"> ,从它的最近邻中随机选择一个样本 <img src="https://www.zhihu.com/equation?tex=%5Chat%7Bx_%7Bi%7D%7D" srcset="/img/loading.gif" lazyload alt="[公式]"> ( <img src="https://www.zhihu.com/equation?tex=%5Chat%7Bx_%7Bi%7D%7D" srcset="/img/loading.gif" lazyload alt="[公式]"> 是少数类中的一个样本),然后在 <img src="https://www.zhihu.com/equation?tex=x_%7Bi%7D" srcset="/img/loading.gif" lazyload alt="[公式]"> 和 <img src="https://www.zhihu.com/equation?tex=%5Chat%7Bx_%7Bi%7D%7D" srcset="/img/loading.gif" lazyload alt="[公式]"> 之间的连线上随机选择一点作为新合成的少数类样本。</p></blockquote><p>SMOTE算法合成新少数类样本的算法描述如下:</p><ul><li><ol><li>对于少数类中的每一个样本 <img src="https://www.zhihu.com/equation?tex=x_%7Bi%7D" srcset="/img/loading.gif" lazyload alt="[公式]"> ,以欧氏距离为标准计算它到少数类样本集 <img src="https://www.zhihu.com/equation?tex=S_%7Bmin%7D" srcset="/img/loading.gif" lazyload alt="[公式]"> 中所有样本的距离,得到其k近邻。</li></ol></li><li><ol start="2"><li>根据样本不平衡比例设置一个采样比例以确定采样倍率N,对于每一个少数类样本 <img src="https://www.zhihu.com/equation?tex=x_%7Bi%7D" srcset="/img/loading.gif" lazyload alt="[公式]"> ,从其k近邻中随机选择若干个样本,假设选择的是 <img src="https://www.zhihu.com/equation?tex=%5Chat%7Bx_%7Bi%7D%7D" srcset="/img/loading.gif" lazyload alt="[公式]"> 。</li></ol></li><li><ol start="3"><li>对于每一个随机选出来的近邻 <img src="https://www.zhihu.com/equation?tex=%5Chat%7Bx_%7Bi%7D%7D" srcset="/img/loading.gif" lazyload alt="[公式]"> ,分别与 <img src="https://www.zhihu.com/equation?tex=x_%7Bi%7D" srcset="/img/loading.gif" lazyload alt="[公式]"> 按照如下公式构建新的样本。</li></ol></li></ul><img src="https://tva1.sinaimg.cn/large/006tNbRwly1gaztjwh1k9j30fa022mx4.jpg" srcset="/img/loading.gif" lazyload alt="image-20200117201311799" style="zoom:50%"><hr><p>我们用图文表达的方式,再来描述一下SMOTE算法。</p><ol><li>先随机选定一个少数类样本 <img src="https://www.zhihu.com/equation?tex=x_%7Bi%7D" srcset="/img/loading.gif" lazyload alt="[公式]"> 。</li></ol><img src="https://tva1.sinaimg.cn/large/006tNbRwly1gadzj9rsb6j30cy08gta1.jpg" srcset="/img/loading.gif" lazyload alt="image-20191229225742800" style="zoom:50%"><ol start="2"><li>找出这个少数类样本 <img src="https://www.zhihu.com/equation?tex=x_%7Bi%7D" srcset="/img/loading.gif" lazyload alt="[公式]"> 的K个近邻(假设K=5),5个近邻已经被圈出。</li></ol><img src="https://tva1.sinaimg.cn/large/006tNbRwly1gadzjr88hkj30d0086myn.jpg" srcset="/img/loading.gif" lazyload alt="image-20191229225812157" style="zoom:50%"><ol start="3"><li>随机从这K个近邻中选出一个样本 <img src="https://www.zhihu.com/equation?tex=%5Chat%7Bx_%7Bi%7D%7D" srcset="/img/loading.gif" lazyload alt="[公式]"> (用绿色圈出来了)。</li></ol><img src="https://tva1.sinaimg.cn/large/006tNbRwly1gadzk53hm3j30c8088jss.jpg" srcset="/img/loading.gif" lazyload alt="image-20191229225834558" style="zoom:50%"><p>4)在少数类样本 <img src="https://www.zhihu.com/equation?tex=x_%7Bi%7D" srcset="/img/loading.gif" lazyload alt="[公式]"> 和被选中的这个近邻样本 <img src="https://www.zhihu.com/equation?tex=%5Chat%7Bx_%7Bi%7D%7D" srcset="/img/loading.gif" lazyload alt="[公式]"> 之间的连线上,随机找一点。这个点就是人工合成的新的样本点(绿色正号标出)。</p><img src="https://tva1.sinaimg.cn/large/006tNbRwly1gadzkjad2pj30ca07w402.jpg" srcset="/img/loading.gif" lazyload alt="image-20191229225858077" style="zoom:50%"><p>SMOTE算法摒弃了随机过采样复制样本的做法,可以防止随机过采样中容易过拟合的问题,实践证明此方法可以提高分类器的性能。</p><ul><li>代码实现:</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># SMOTE过采样</span><br><span class="hljs-keyword">from</span> imblearn.over_sampling <span class="hljs-keyword">import</span> SMOTE<br>X_resampled, y_resampled = SMOTE().fit_resample(X, y)<br>Counter(y_resampled)<br><br><span class="hljs-comment"># 采样后样本结果</span><br><span class="hljs-comment"># [(0, 4674), (1, 4674), (2, 4674)]</span><br><br><span class="hljs-comment"># 数据集可视化</span><br>plt.scatter(X_resampled[:, <span class="hljs-number">0</span>], X_resampled[:, <span class="hljs-number">1</span>], c=y_resampled)<br>plt.show()<br></code></pre></td></tr></table></figure><img src="https://tva1.sinaimg.cn/large/006tNbRwly1gae1xnw2wvj30lq0e676f.jpg" srcset="/img/loading.gif" lazyload alt="image-20191230002046690" style="zoom:50%"><h3 id="22-欠采样方法"><a class="markdownIt-Anchor" href="#22-欠采样方法"></a> 2.2 欠采样方法</h3><h4 id="221-什么是欠采样方法"><a class="markdownIt-Anchor" href="#221-什么是欠采样方法"></a> 2.2.1 什么是欠采样方法</h4><p>直接对训练集中多数类样本进行“欠采样”(undersampling),即去<strong>除一些多数类中的样本使得正例、反例数目接近,然后再进行学习。</strong></p><h4 id="222-随机欠采样方法"><a class="markdownIt-Anchor" href="#222-随机欠采样方法"></a> 2.2.2 随机欠采样方法</h4><p>随机欠采样顾名思义即从多数类 <img src="https://www.zhihu.com/equation?tex=S_%7Bmaj%7D" srcset="/img/loading.gif" lazyload alt="[公式]"> 中随机选择一些样样本组成样本集 <img src="https://www.zhihu.com/equation?tex=E" srcset="/img/loading.gif" lazyload alt="[公式]"> 。然后将样本集 <img src="https://www.zhihu.com/equation?tex=E" srcset="/img/loading.gif" lazyload alt="[公式]"> 从 <img src="https://www.zhihu.com/equation?tex=S_%7Bmaj%7D" srcset="/img/loading.gif" lazyload alt="[公式]"> 中移除。新的数据集 <img src="https://www.zhihu.com/equation?tex=S_%7Bnew-maj%7D%3DS_%7Bmaj%7D-E" srcset="/img/loading.gif" lazyload alt="[公式]"> 。</p><ul><li>代码实现:</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># 随机欠采样</span><br><span class="hljs-keyword">from</span> imblearn.under_sampling <span class="hljs-keyword">import</span> RandomUnderSampler<br>rus = RandomUnderSampler(random_state=<span class="hljs-number">0</span>)<br>X_resampled, y_resampled = rus.fit_resample(X, y)<br>Counter(y_resampled)<br><br><span class="hljs-comment"># 采样后结果</span><br>[(<span class="hljs-number">0</span>, <span class="hljs-number">64</span>), (<span class="hljs-number">1</span>, <span class="hljs-number">64</span>), (<span class="hljs-number">2</span>, <span class="hljs-number">64</span>)]<br><br><span class="hljs-comment"># 数据集可视化</span><br>plt.scatter(X_resampled[:, <span class="hljs-number">0</span>], X_resampled[:, <span class="hljs-number">1</span>], c=y_resampled)<br>plt.show()<br></code></pre></td></tr></table></figure><img src="https://tva1.sinaimg.cn/large/006tNbRwly1gae20fk2zyj30lu0ds0v4.jpg" srcset="/img/loading.gif" lazyload alt="image-20191230002326732" style="zoom:50%"><hr><ul><li>缺点:<ul><li>随机欠采样方法通过改变多数类样本比例以达到修改样本分布的目的,从而使样本分布较为均衡,但是这也存在一些问题。对于随机欠采样,<strong>由于采样的样本集合要少于原来的样本集合,因此会造成一些信息缺失,即将多数类样本删除有可能会导致分类器丢失有关多数类的重要信息。</strong></li></ul></li></ul><hr><p>官网链接:<a href="https://imbalanced-learn.readthedocs.io/en/stable/ensemble.html" target="_blank" rel="noopener">https://imbalanced-learn.readthedocs.io/en/stable/ensemble.html</a></p>]]></content>
<categories>
<category>机器学习</category>
</categories>
<tags>
<tag>ML</tag>
</tags>
</entry>
<entry>
<title>独立同分布</title>
<link href="/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ML/%E7%8B%AC%E7%AB%8B%E5%90%8C%E5%88%86%E5%B8%83/"/>
<url>/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ML/%E7%8B%AC%E7%AB%8B%E5%90%8C%E5%88%86%E5%B8%83/</url>
<content type="html"><![CDATA[<h1 id="独立同分布iidindependent-and-identically-distributed"><a class="markdownIt-Anchor" href="#独立同分布iidindependent-and-identically-distributed"></a> 独立同分布IID(independent and identically distributed)</h1><h2 id="1-独立同分布iid"><a class="markdownIt-Anchor" href="#1-独立同分布iid"></a> 1 独立同分布(i.i.d.)</h2><p>在概率统计理论中,<strong>如果变量序列或者其他随机变量有相同的概率分布,并且互相独立,那么这些随机变量是独立同分布。</strong></p><p>在西瓜书中解释是:<strong>输入空间中的所有样本服从一个隐含未知的分布,训练数据所有样本都是独立地从这个分布上采样而得。</strong></p><h2 id="2-简单解释-独立-同分布-独立同分布"><a class="markdownIt-Anchor" href="#2-简单解释-独立-同分布-独立同分布"></a> 2 简单解释 — 独立、同分布、独立同分布</h2><p>(1)<strong>独立</strong>:每次抽样之间没有关系,不会相互影响</p><p>举例:给一个骰子,每次抛骰子抛到几就是几,这是独立;如果我要抛骰子两次之和大于8,那么第一次和第二次抛就不独立,因为第二次抛的结果和第一次相关。</p><p>(2)<strong>同分布</strong>:每次抽样,样本服从同一个分布</p><p>举例:给一个骰子,每次抛骰子得到任意点数的概率都是六分之一,这个就是同分布</p><p>(3)<strong>独立同分布</strong>:i.i.d.,每次抽样之间独立而且同分布</p><h2 id="3-机器学习领域的重要假设"><a class="markdownIt-Anchor" href="#3-机器学习领域的重要假设"></a> 3 机器学习领域的重要假设</h2><p>IID独立同分布即假设<strong>训练数据和测试数据是满足相同分布的,它是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。</strong></p><h2 id="4-目前发展"><a class="markdownIt-Anchor" href="#4-目前发展"></a> 4 目前发展</h2><p>机器学习并不总要求独立同分布,在不少问题中要求样本数据采样自同一个分布是因为希望用训练数据集得到的模型可以合理的用于测试数据集,使用独立同分布假设能够解释得通。</p><p>目前<strong>一些机器学习内容已经不再囿于独立同分布假设下,一些问题会假设样本没有同分布</strong>。</p>]]></content>
<categories>
<category>机器学习</category>
</categories>
<tags>
<tag>ML</tag>
</tags>
</entry>
<entry>
<title>完整机器学习项目的流程</title>
<link href="/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ML/%E5%AE%8C%E6%95%B4%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E9%A1%B9%E7%9B%AE%E7%9A%84%E6%B5%81%E7%A8%8B/"/>
<url>/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ML/%E5%AE%8C%E6%95%B4%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E9%A1%B9%E7%9B%AE%E7%9A%84%E6%B5%81%E7%A8%8B/</url>
<content type="html"><![CDATA[<h1 id="完整机器学习项目的流程"><a class="markdownIt-Anchor" href="#完整机器学习项目的流程"></a> 完整机器学习项目的流程</h1><h4 id="1-抽象成数学问题"><a class="markdownIt-Anchor" href="#1-抽象成数学问题"></a> <strong>1</strong> <strong>抽象成数学问题</strong></h4><p>明确问题是进行机器学习的第一步。机器学习的训练过程通常都是一件非常耗时的事情,胡乱尝试时间成本是非常高的。</p><p>这里的抽象成数学问题,指的明确我们可以获得什么样的数据,抽象出的问题,是一个分类还是回归或者是聚类的问题。</p><h4 id="2-获取数据"><a class="markdownIt-Anchor" href="#2-获取数据"></a> <strong>2</strong> <strong>获取数据</strong></h4><p>数据决定了机器学习结果的上限,而算法只是尽可能逼近这个上限。</p><p>数据要有代表性,否则必然会过拟合。</p><p>而且对于分类问题,数据偏斜不能过于严重,不同类别的数据数量不要有数量级的差距。</p><p>而且还要对数据的量级有一个评估,多少个样本,多少个特征,可以估算出其对内存的消耗程度,判断训练过程中内存是否能够放得下。如果放不下就得考虑改进算法或者使用一些降维的技巧了。如果数据量实在太大,那就要考虑分布式了。</p><h4 id="3-特征预处理与特征选择"><a class="markdownIt-Anchor" href="#3-特征预处理与特征选择"></a> <strong>3</strong> <strong>特征预处理与特征选择</strong></h4><p>良好的数据要能够提取出良好的特征才能真正发挥作用。</p><p>特征预处理、数据清洗是很关键的步骤,往往能够使得算法的效果和性能得到显著提高。归一化、离散化、因子化、缺失值处理、去除共线性等,数据挖掘过程中很多时间就花在它们上面。这些工作简单可复制,收益稳定可预期,是机器学习的基础必备步骤。</p><p>筛选出显著特征、摒弃非显著特征,需要机器学习工程师反复理解业务。这对很多结果有决定性的影响。特征选择好了,非常简单的算法也能得出良好、稳定的结果。这需要运用特征有效性分析的相关技术,如相关系数、卡方检验、平均互信息、条件熵、后验概率、逻辑回归权重等方法。</p><h4 id="4-训练模型与调优"><a class="markdownIt-Anchor" href="#4-训练模型与调优"></a> <strong>4</strong> <strong>训练模型与调优</strong></h4><p>直到这一步才用到我们上面说的算法进行训练。现在很多算法都能够封装成黑盒供人使用。但是真正考验水平的是调整这些算法的(超)参数,使得结果变得更加优良。这需要我们对算法的原理有深入的理解。理解越深入,就越能发现问题的症结,提出良好的调优方案。</p><h4 id="5-模型诊断"><a class="markdownIt-Anchor" href="#5-模型诊断"></a> <strong>5</strong> <strong>模型诊断</strong></h4><p>如何确定模型调优的方向与思路呢?这就需要对模型进行诊断的技术。</p><p>过拟合、欠拟合 判断是模型诊断中至关重要的一步。常见的方法如交叉验证,绘制学习曲线等。过拟合的基本调优思路是增加数据量,降低模型复杂度。欠拟合的基本调优思路是提高特征数量和质量,增加模型复杂度。</p><p>误差分析 也是机器学习至关重要的步骤。通过观察误差样本全面分析产生误差的原因:是参数的问题还是算法选择的问题,是特征的问题还是数据本身的问题……</p><p>诊断后的模型需要进行调优,调优后的新模型需要重新进行诊断,这是一个反复迭代不断逼近的过程,需要不断地尝试, 进而达到最优状态。</p><h4 id="6-模型融合"><a class="markdownIt-Anchor" href="#6-模型融合"></a> <strong>6</strong> <strong>模型融合</strong></h4><p>一般来说,模型融合后都能使得效果有一定提升。而且效果很好。</p><p>工程上,主要提升算法准确度的方法是分别在模型的前端(特征清洗和预处理,不同的采样模式)与后端(模型融合)上下功夫。因为他们比较标准可复制,效果比较稳定。而直接调参的工作不会很多,毕竟大量数据训练起来太慢了,而且效果难以保证。</p><h4 id="7-上线运行"><a class="markdownIt-Anchor" href="#7-上线运行"></a> <strong>7</strong> <strong>上线运行</strong></h4><p>这一部分内容主要跟工程实现的相关性比较大。工程上是结果导向,模型在线上运行的效果直接决定模型的成败。 不单纯包括其准确程度、误差等情况,还包括其运行的速度(时间复杂度)、资源消耗程度(空间复杂度)、稳定性是否可接受。</p><p>这些工作流程主要是工程实践上总结出的一些经验。并不是每个项目都包含完整的一个流程。这里的部分只是一个指导性的说明,只有大家自己多实践,多积累项目经验,才会有自己更深刻的认识。</p>]]></content>
<categories>
<category>机器学习</category>
</categories>
<tags>
<tag>ML</tag>
</tags>
</entry>
<entry>
<title>如何理解无偏估计?</title>
<link href="/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ML/%E5%A6%82%E4%BD%95%E7%90%86%E8%A7%A3%E6%97%A0%E5%81%8F%E4%BC%B0%E8%AE%A1/"/>
<url>/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ML/%E5%A6%82%E4%BD%95%E7%90%86%E8%A7%A3%E6%97%A0%E5%81%8F%E4%BC%B0%E8%AE%A1/</url>
<content type="html"><![CDATA[<h1 id="如何理解无偏估计"><a class="markdownIt-Anchor" href="#如何理解无偏估计"></a> 如何理解无偏估计?</h1><h2 id="1如何理解无偏估计"><a class="markdownIt-Anchor" href="#1如何理解无偏估计"></a> 1.如何理解无偏估计</h2><p><strong>无偏估计</strong>:就是我认为<strong>所有样本出现的概率一样</strong>。</p><p>假如有N种样本我们认为所有样本出现概率都是1/N。然后根据这个来计算数学期望。此时的数学期望就是我们平常讲的平均值。</p><blockquote><p>数学期望本质就是平均值</p></blockquote><h2 id="2无偏估计为何叫做无偏它要估计什么"><a class="markdownIt-Anchor" href="#2无偏估计为何叫做无偏它要估计什么"></a> 2.无偏估计为何叫做“无偏”?它要“估计”什么?</h2><p>首先回答第一个问题:它要“估计”什么?</p><ul><li>它要估计的是整体的数学期望(平均值)。</li></ul><p>第二个问题:那为何叫做无偏?有偏是什么?</p><ul><li><p>假设这个是一些样本的集合:$$X=x_1, x_2, x_3,…,x_N$$ 我们根据样本估计整体的数学期望(平均值)。</p></li><li><p>因为正常求期望是加权和,什么叫加权和<img src="https://tva1.sinaimg.cn/large/006tNbRwgy1gaqcv5r11wj307u01at8l.jpg" srcset="/img/loading.gif" lazyload alt="image-20200109154545177" style="zoom:50%">这个就叫加权和。每个样本出现概率不一样,概率大的乘起来就大,这个就产生偏重了(有偏估计)。</p></li><li><p>但是,但是我们不知道某个样本出现的概率啊。比如你从别人口袋里面随机拿了3张钞票。两张是十块钱,一张100元,然后你想估计下他口袋里的剩下的钱平均下来每张多少钱(估计平均值)。</p></li><li><p>然后呢?</p></li><li><p><strong>无偏估计计算数学期望</strong>就是认为所有样本出现概率一样大,没有看不起哪个样本。</p><ul><li>回到求钱的平均值的问题。无偏估计我们认为每张钞票出现概率都是1/2(因为只出现了10和100这两种情况,所以是1/2。如果是出现1 10 100三种情况,每种情况概率则是1/3。</li><li>哪怕拿到了两张十块钱,我还是认为十块钱出现的概率和100元的概率一样。不偏心。所以无偏估计,所估计的别人口袋每张钱的数学期望(平均值)=10 * 1/2+100 * 1/2。</li></ul></li><li><p>有偏估计那就是偏重那些出现次数多的样本。认为样本的概率是不一样的。</p><ul><li>我出现了两次十块钱,那么我认为十块钱的概率是2/3,100块钱概率只有1/3. 有偏所估计的别人口袋每张钱的数学期望(平均值)=10 * 2/3+100 * 1/3。</li></ul></li></ul><h2 id="3为何要用无偏估计"><a class="markdownIt-Anchor" href="#3为何要用无偏估计"></a> 3.为何要用无偏估计?</h2><p>因为现实生活中我不知道某个样本出现的概率啊,就像骰子,我不知道他是不是加过水银。</p><p>所以我们暂时按照每种情况出现概率一样来算。</p>]]></content>
<categories>
<category>机器学习</category>
</categories>
<tags>
<tag>ML</tag>
</tags>
</entry>
<entry>
<title>模型的保存和加载</title>
<link href="/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ML/%E6%A8%A1%E5%9E%8B%E7%9A%84%E4%BF%9D%E5%AD%98%E5%92%8C%E5%8A%A0%E8%BD%BD/"/>
<url>/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ML/%E6%A8%A1%E5%9E%8B%E7%9A%84%E4%BF%9D%E5%AD%98%E5%92%8C%E5%8A%A0%E8%BD%BD/</url>
<content type="html"><![CDATA[<h1 id="模型的保存和加载"><a class="markdownIt-Anchor" href="#模型的保存和加载"></a> 模型的保存和加载</h1><h2 id="1sklearn模型的保存和加载api"><a class="markdownIt-Anchor" href="#1sklearn模型的保存和加载api"></a> 1.sklearn模型的保存和加载API</h2><ul><li>from sklearn.externals import joblib<ul><li>保存:joblib.dump(estimator, ‘test.pkl’)</li><li>加载:estimator = joblib.load(‘test.pkl’)</li></ul></li></ul><h2 id="2线性回归的模型保存加载案例"><a class="markdownIt-Anchor" href="#2线性回归的模型保存加载案例"></a> 2.线性回归的模型保存加载案例</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">load_dump_demo</span><span class="hljs-params">()</span>:</span><br> <span class="hljs-string">"""</span><br><span class="hljs-string"> 模型保存和加载</span><br><span class="hljs-string"> :return:</span><br><span class="hljs-string"> """</span><br> <span class="hljs-comment"># 1.获取数据</span><br> data = load_boston()<br><br> <span class="hljs-comment"># 2.数据集划分</span><br> x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, random_state=<span class="hljs-number">22</span>)<br><br> <span class="hljs-comment"># 3.特征工程-标准化</span><br> transfer = StandardScaler()<br> x_train = transfer.fit_transform(x_train)<br> x_test = transfer.fit_transform(x_test)<br><br> <span class="hljs-comment"># 4.机器学习-线性回归(岭回归)</span><br> <span class="hljs-comment"># # 4.1 模型训练</span><br> <span class="hljs-comment"># estimator = Ridge(alpha=1)</span><br> <span class="hljs-comment"># estimator.fit(x_train, y_train)</span><br> <span class="hljs-comment">#</span><br> <span class="hljs-comment"># # 4.2 模型保存</span><br> <span class="hljs-comment"># joblib.dump(estimator, "./data/test.pkl")</span><br><br> <span class="hljs-comment"># 4.3 模型加载</span><br> estimator = joblib.load(<span class="hljs-string">"./data/test.pkl"</span>)<br><br> <span class="hljs-comment"># 5.模型评估</span><br> <span class="hljs-comment"># 5.1 获取系数等值</span><br> y_predict = estimator.predict(x_test)<br> print(<span class="hljs-string">"预测值为:\n"</span>, y_predict)<br> print(<span class="hljs-string">"模型中的系数为:\n"</span>, estimator.coef_)<br> print(<span class="hljs-string">"模型中的偏置为:\n"</span>, estimator.intercept_)<br><br> <span class="hljs-comment"># 5.2 评价</span><br> <span class="hljs-comment"># 均方误差</span><br> error = mean_squared_error(y_test, y_predict)<br> print(<span class="hljs-string">"误差为:\n"</span>, error)<br></code></pre></td></tr></table></figure><h2 id="3tips"><a class="markdownIt-Anchor" href="#3tips"></a> 3.tips</h2><p>如果你在学习过程中,发现使用上面方法报如下错误:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs python">ImportError: cannot <span class="hljs-keyword">import</span> name <span class="hljs-string">'joblib'</span> <span class="hljs-keyword">from</span> <span class="hljs-string">'sklearn.externals'</span> (/Library/Python/<span class="hljs-number">3.7</span>/site-packages/sklearn/externals/__init__.py)<br></code></pre></td></tr></table></figure><p>这是因为scikit-learn版本在0.21之后,无法使用<code>from sklearn.externals import joblib</code>进行导入,你安装的scikit-learn版本有可能是最新版本。如果需要保存模块,可以使用:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-comment"># 安装</span><br>pip install joblib<br><br><span class="hljs-comment"># 导入</span><br><span class="hljs-keyword">import</span> joblib<br></code></pre></td></tr></table></figure><p>安装joblib,然后使用<code>joblib.load</code>进行加载;使用<code>joblib.dump</code>进行保存</p><p>参考:<a href="https://scikit-learn.org/stable/modules/model_persistence.html" target="_blank" rel="noopener">https://scikit-learn.org/stable/modules/model_persistence.html</a></p>]]></content>
<categories>
<category>机器学习</category>
</categories>
<tags>
<tag>ML</tag>
</tags>
</entry>
<entry>
<title>ROC曲线的绘制</title>
<link href="/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ML/ROC%E6%9B%B2%E7%BA%BF%E7%9A%84%E7%BB%98%E5%88%B6/"/>
<url>/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/ML/ROC%E6%9B%B2%E7%BA%BF%E7%9A%84%E7%BB%98%E5%88%B6/</url>
<content type="html"><![CDATA[<h1 id="roc曲线的绘制"><a class="markdownIt-Anchor" href="#roc曲线的绘制"></a> ROC曲线的绘制</h1><p>关于ROC曲线的绘制过程,通过以下举例进行说明</p><p>假设有6次展示记录,有两次被点击了,得到一个展示序列(1:1,2:0,3:1,4:0,5:0,6:0),前面的表示序号,后面的表示点击(1)或没有点击(0)。</p><p>然后在这6次展示的时候都通过model算出了点击的概率序列。</p><p>下面看三种情况。</p><h2 id="1曲线绘制"><a class="markdownIt-Anchor" href="#1曲线绘制"></a> 1.曲线绘制</h2><h3 id="11-序列一曲线绘制"><a class="markdownIt-Anchor" href="#11-序列一曲线绘制"></a> 1.1 序列一曲线绘制</h3><p><strong>如果概率的序列是(1:0.9,2:0.7,3:0.8,4:0.6,5:0.5,6:0.4)。</strong></p><p>与原来的序列一起,得到序列(从概率从高到低排)</p><table><thead><tr><th>1</th><th>1</th><th>0</th><th>0</th><th>0</th><th>0</th></tr></thead><tbody><tr><td>0.9</td><td>0.8</td><td>0.7</td><td>0.6</td><td>0.5</td><td>0.4</td></tr></tbody></table><ul><li>绘制的步骤是:<ul><li>1)把概率序列从高到低排序,得到顺序(1:0.9,3:0.8,2:0.7,4:0.6,5:0.5,6:0.4);</li><li>2)从概率最大开始取一个点作为正类,取到点1,计算得到TPR=0.5,FPR=0.0;</li><li>3)从概率最大开始,再取一个点作为正类,取到点3,计算得到TPR=1.0,FPR=0.0;</li><li>4)再从最大开始取一个点作为正类,取到点2,计算得到TPR=1.0,FPR=0.25;</li><li>5)以此类推,得到6对TPR和FPR。</li></ul></li></ul><p>然后把这6对数据组成6个点(0,0.5),(0,1.0),(0.25,1),(0.5,1),(0.75,1),(1.0,1.0)。</p><p>这6个点在二维坐标系中能绘出来。</p><p><img src="https://tva1.sinaimg.cn/large/006tNbRwly1ga8u0xb9brj314m0eejt4.jpg" srcset="/img/loading.gif" lazyload alt="image-20190406170931355"></p><p>看看图中,那个就是ROC曲线。</p><h3 id="12-序列二曲线绘制"><a class="markdownIt-Anchor" href="#12-序列二曲线绘制"></a> 1.2 序列二曲线绘制</h3><p><strong>如果概率的序列是(1:0.9,2:0.8,3:0.7,4:0.6,5:0.5,6:0.4)</strong></p><p>与原来的序列一起,得到序列(从概率从高到低排)</p><table><thead><tr><th>1</th><th>0</th><th>1</th><th>0</th><th>0</th><th>0</th></tr></thead><tbody><tr><td>0.9</td><td>0.8</td><td>0.7</td><td>0.6</td><td>0.5</td><td>0.4</td></tr></tbody></table><ul><li>绘制的步骤是:<ul><li>1)把概率序列从高到低排序,得到顺序(1:0.9,2:0.8,3:0.7,4:0.6,5:0.5,6:0.4);</li><li>2)从概率最大开始取一个点作为正类,取到点1,计算得到TPR=0.5,FPR=0.0;</li><li>3)从概率最大开始,再取一个点作为正类,取到点2,计算得到TPR=0.5,FPR=0.25;</li><li>4)再从最大开始取一个点作为正类,取到点3,计算得到TPR=1.0,FPR=0.25;</li><li>5)以此类推,得到6对TPR和FPR。</li></ul></li></ul><p>然后把这6对数据组成6个点(0,0.5),(0.25,0.5),(0.25,1),(0.5,1),(0.75,1),(1.0,1.0)。</p><p>这6个点在二维坐标系中能绘出来。</p><p><img src="https://tva1.sinaimg.cn/large/006tNbRwly1ga8u0yncd6j312o0e075z.jpg" srcset="/img/loading.gif" lazyload alt="image-20190406171018456"></p><p>看看图中,那个就是ROC曲线。</p><h3 id="13-序列三曲线绘制"><a class="markdownIt-Anchor" href="#13-序列三曲线绘制"></a> 1.3 序列三曲线绘制</h3><p><strong>如果概率的序列是(1:0.4,2:0.6,3:0.5,4:0.7,5:0.8,6:0.9)</strong></p><p>与原来的序列一起,得到序列(从概率从高到低排)</p><table><thead><tr><th>0</th><th>0</th><th>0</th><th>0</th><th>1</th><th>1</th></tr></thead><tbody><tr><td>0.9</td><td>0.8</td><td>0.7</td><td>0.6</td><td>0.5</td><td>0.4</td></tr></tbody></table><ul><li>绘制的步骤是:<ul><li>1)把概率序列从高到低排序,得到顺序(6:0.9,5:0.8,4:0.7,2:0.6,3:0.5,1:0.4);</li><li>2)从概率最大开始取一个点作为正类,取到点6,计算得到TPR=0.0,FPR=0.25;</li><li>3)从概率最大开始,再取一个点作为正类,取到点5,计算得到TPR=0.0,FPR=0.5;</li><li>4)再从最大开始取一个点作为正类,取到点4,计算得到TPR=0.0,FPR=0.75;</li><li>5)以此类推,得到6对TPR和FPR。</li></ul></li></ul><p>然后把这6对数据组成6个点(0.25,0.0),(0.5,0.0),(0.75,0.0),(1.0,0.0),(1.0,0.5),(1.0,1.0)。</p><p>这6个点在二维坐标系中能绘出来。</p><p><img src="https://tva1.sinaimg.cn/large/006tNbRwly1ga8u0zcc7hj31240ecac0.jpg" srcset="/img/loading.gif" lazyload alt="image-20190406171135154"></p><p>看看图中,那个就是ROC曲线。</p><h2 id="2意义解释"><a class="markdownIt-Anchor" href="#2意义解释"></a> 2.意义解释</h2><p>如上图的例子,总共6个点,2个正样本,4个负样本,取一个正样本和一个负样本的情况总共有8种。</p><p>上面的第一种情况,从上往下取,无论怎么取,正样本的概率总在负样本之上,所以分对的概率为1,AUC=1。再看那个ROC曲线,它的积分是什么?也是1,ROC曲线的积分与AUC相等。</p><p>上面第二种情况,如果取到了样本2和3,那就分错了,其他情况都分对了;所以分对的概率是0.875,AUC=0.875。再看那个ROC曲线,它的积分也是0.875,ROC曲线的积分与AUC相等。</p><p>上面的第三种情况,无论怎么取,都是分错的,所以分对的概率是0,AUC=0.0。再看ROC曲线,它的积分也是0.0,ROC曲线的积分与AUC相等。</p><p>很牛吧,其实AUC的意思是——Area Under roc Curve,就是ROC曲线的积分,也是ROC曲线下面的面积。</p><p>绘制ROC曲线的意义很明显,不断地把可能分错的情况扣除掉,从概率最高往下取的点,每有一个是负样本,就会导致分错排在它下面的所有正样本,所以要把它下面的正样本数扣除掉(1-TPR,剩下的正样本的比例)。总的ROC曲线绘制出来了,AUC就定了,分对的概率也能求出来了。</p>]]></content>
<categories>
<category>机器学习</category>
</categories>
<tags>
<tag>ML</tag>
</tags>
</entry>