forked from mnielsen/nnadl_site
-
Notifications
You must be signed in to change notification settings - Fork 34
/
Copy pathchap6.html
4777 lines (4695 loc) · 409 KB
/
chap6.html
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
<!DOCTYPE html>
<html lang="en">
<!-- Produced from a LaTeX source file. Note that the production is done -->
<!-- by a very rough-and-ready (and buggy) script, so the HTML and other -->
<!-- code is quite ugly! Later versions should be better. -->
<head>
<meta charset="utf-8">
<meta name="citation_title" content="ニューラルネットワークと深層学習">
<meta name="citation_author" content="Nielsen, Michael A.">
<meta name="citation_publication_date" content="2015">
<meta name="citation_fulltext_html_url" content="http://neuralnetworksanddeeplearning.com">
<meta name="citation_publisher" content="Determination Press">
<link rel="icon" href="nnadl_favicon.ICO" />
<title>Neural networks and deep learning</title>
<script src="assets/jquery.min.js"></script>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
tex2jax: {inlineMath: [['$','$']]},
"HTML-CSS":
{scale: 92},
TeX: { equationNumbers: { autoNumber: "AMS" }}});
</script>
<script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link href="assets/style.css" rel="stylesheet">
<link href="assets/pygments.css" rel="stylesheet">
<link rel="stylesheet" href="https://code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css">
<style>
/* Adapted from */
/* https://groups.google.com/d/msg/mathjax-users/jqQxrmeG48o/oAaivLgLN90J, */
/* by David Cervone */
@font-face {
font-family: 'MJX_Math';
src: url('https://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/eot/MathJax_Math-Italic.eot'); /* IE9 Compat Modes */
src: url('https://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/eot/MathJax_Math-Italic.eot?iefix') format('eot'),
url('https://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/woff/MathJax_Math-Italic.woff') format('woff'),
url('https://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/otf/MathJax_Math-Italic.otf') format('opentype'),
url('https://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/svg/MathJax_Math-Italic.svg#MathJax_Math-Italic') format('svg');
}
@font-face {
font-family: 'MJX_Main';
src: url('https://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/eot/MathJax_Main-Regular.eot'); /* IE9 Compat Modes */
src: url('https://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/eot/MathJax_Main-Regular.eot?iefix') format('eot'),
url('https://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/woff/MathJax_Main-Regular.woff') format('woff'),
url('https://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/otf/MathJax_Main-Regular.otf') format('opentype'),
url('https://cdn.mathjax.org/mathjax/latest/fonts/HTML-CSS/TeX/svg/MathJax_Main-Regular.svg#MathJax_Main-Regular') format('svg');
}
</style>
</head>
<body><div class="header"><h1 class="chapter_number">
<a href="">CHAPTER 6</a></h1>
<h1 class="chapter_title"><a href="">ディープラーニング</a></h1></div><div class="section"><div id="toc">
<p class="toc_title"><a href="index.html">ニューラルネットワークと深層学習</a></p><p class="toc_not_mainchapter"><a href="about.html">What this book is about</a></p><p class="toc_not_mainchapter"><a href="exercises_and_problems.html">On the exercises and problems</a></p><p class='toc_mainchapter'><a id="toc_using_neural_nets_to_recognize_handwritten_digits_reveal" class="toc_reveal" onMouseOver="this.style.borderBottom='1px solid #2A6EA6';" onMouseOut="this.style.borderBottom='0px';"><img id="toc_img_using_neural_nets_to_recognize_handwritten_digits" src="images/arrow.png" width="15px"></a><a href="chap1.html">ニューラルネットワークを用いた手書き文字認識</a><div id="toc_using_neural_nets_to_recognize_handwritten_digits" style="display: none;"><p class="toc_section"><ul><a href="chap1.html#perceptrons"><li>Perceptrons</li></a><a href="chap1.html#sigmoid_neurons"><li>Sigmoid neurons</li></a><a href="chap1.html#the_architecture_of_neural_networks"><li>The architecture of neural networks</li></a><a href="chap1.html#a_simple_network_to_classify_handwritten_digits"><li>A simple network to classify handwritten digits</li></a><a href="chap1.html#learning_with_gradient_descent"><li>Learning with gradient descent</li></a><a href="chap1.html#implementing_our_network_to_classify_digits"><li>Implementing our network to classify digits</li></a><a href="chap1.html#toward_deep_learning"><li>Toward deep learning</li></a></ul></p></div>
<script>
$('#toc_using_neural_nets_to_recognize_handwritten_digits_reveal').click(function() {
var src = $('#toc_img_using_neural_nets_to_recognize_handwritten_digits').attr('src');
if(src == 'images/arrow.png') {
$("#toc_img_using_neural_nets_to_recognize_handwritten_digits").attr('src', 'images/arrow_down.png');
} else {
$("#toc_img_using_neural_nets_to_recognize_handwritten_digits").attr('src', 'images/arrow.png');
};
$('#toc_using_neural_nets_to_recognize_handwritten_digits').toggle('fast', function() {});
});</script><p class='toc_mainchapter'><a id="toc_how_the_backpropagation_algorithm_works_reveal" class="toc_reveal" onMouseOver="this.style.borderBottom='1px solid #2A6EA6';" onMouseOut="this.style.borderBottom='0px';"><img id="toc_img_how_the_backpropagation_algorithm_works" src="images/arrow.png" width="15px"></a><a href="chap2.html">逆伝播の仕組み</a><div id="toc_how_the_backpropagation_algorithm_works" style="display: none;"><p class="toc_section"><ul><a href="chap2.html#warm_up_a_fast_matrix-based_approach_to_computing_the_output_from_a_neural_network"><li>Warm up: a fast matrix-based approach to computing the output from a neural network</li></a><a href="chap2.html#the_two_assumptions_we_need_about_the_cost_function"><li>The two assumptions we need about the cost function</li></a><a href="chap2.html#the_hadamard_product_$s_\odot_t$"><li>The Hadamard product, $s \odot t$</li></a><a href="chap2.html#the_four_fundamental_equations_behind_backpropagation"><li>The four fundamental equations behind backpropagation</li></a><a href="chap2.html#proof_of_the_four_fundamental_equations_(optional)"><li>Proof of the four fundamental equations (optional)</li></a><a href="chap2.html#the_backpropagation_algorithm"><li>The backpropagation algorithm</li></a><a href="chap2.html#the_code_for_backpropagation"><li>The code for backpropagation</li></a><a href="chap2.html#in_what_sense_is_backpropagation_a_fast_algorithm"><li>In what sense is backpropagation a fast algorithm?</li></a><a href="chap2.html#backpropagation_the_big_picture"><li>Backpropagation: the big picture</li></a></ul></p></div>
<script>
$('#toc_how_the_backpropagation_algorithm_works_reveal').click(function() {
var src = $('#toc_img_how_the_backpropagation_algorithm_works').attr('src');
if(src == 'images/arrow.png') {
$("#toc_img_how_the_backpropagation_algorithm_works").attr('src', 'images/arrow_down.png');
} else {
$("#toc_img_how_the_backpropagation_algorithm_works").attr('src', 'images/arrow.png');
};
$('#toc_how_the_backpropagation_algorithm_works').toggle('fast', function() {});
});</script><p class='toc_mainchapter'><a id="toc_improving_the_way_neural_networks_learn_reveal" class="toc_reveal" onMouseOver="this.style.borderBottom='1px solid #2A6EA6';" onMouseOut="this.style.borderBottom='0px';"><img id="toc_img_improving_the_way_neural_networks_learn" src="images/arrow.png" width="15px"></a><a href="chap3.html">ニューラルネットワークの学習の改善</a><div id="toc_improving_the_way_neural_networks_learn" style="display: none;"><p class="toc_section"><ul><a href="chap3.html#the_cross-entropy_cost_function"><li>The cross-entropy cost function</li></a><a href="chap3.html#overfitting_and_regularization"><li>Overfitting and regularization</li></a><a href="chap3.html#weight_initialization"><li>Weight initialization</li></a><a href="chap3.html#handwriting_recognition_revisited_the_code"><li>Handwriting recognition revisited: the code</li></a><a href="chap3.html#how_to_choose_a_neural_network's_hyper-parameters"><li>How to choose a neural network's hyper-parameters?</li></a><a href="chap3.html#other_techniques"><li>Other techniques</li></a></ul></p></div>
<script>
$('#toc_improving_the_way_neural_networks_learn_reveal').click(function() {
var src = $('#toc_img_improving_the_way_neural_networks_learn').attr('src');
if(src == 'images/arrow.png') {
$("#toc_img_improving_the_way_neural_networks_learn").attr('src', 'images/arrow_down.png');
} else {
$("#toc_img_improving_the_way_neural_networks_learn").attr('src', 'images/arrow.png');
};
$('#toc_improving_the_way_neural_networks_learn').toggle('fast', function() {});
});</script><p class='toc_mainchapter'><a id="toc_a_visual_proof_that_neural_nets_can_compute_any_function_reveal" class="toc_reveal" onMouseOver="this.style.borderBottom='1px solid #2A6EA6';" onMouseOut="this.style.borderBottom='0px';"><img id="toc_img_a_visual_proof_that_neural_nets_can_compute_any_function" src="images/arrow.png" width="15px"></a><a href="chap4.html">ニューラルネットワークが任意の関数を表現できることの視覚的証明</a><div id="toc_a_visual_proof_that_neural_nets_can_compute_any_function" style="display: none;"><p class="toc_section"><ul><a href="chap4.html#two_caveats"><li>Two caveats</li></a><a href="chap4.html#universality_with_one_input_and_one_output"><li>Universality with one input and one output</li></a><a href="chap4.html#many_input_variables"><li>Many input variables</li></a><a href="chap4.html#extension_beyond_sigmoid_neurons"><li>Extension beyond sigmoid neurons</li></a><a href="chap4.html#fixing_up_the_step_functions"><li>Fixing up the step functions</li></a><a href="chap4.html#conclusion"><li>Conclusion</li></a></ul></p></div>
<script>
$('#toc_a_visual_proof_that_neural_nets_can_compute_any_function_reveal').click(function() {
var src = $('#toc_img_a_visual_proof_that_neural_nets_can_compute_any_function').attr('src');
if(src == 'images/arrow.png') {
$("#toc_img_a_visual_proof_that_neural_nets_can_compute_any_function").attr('src', 'images/arrow_down.png');
} else {
$("#toc_img_a_visual_proof_that_neural_nets_can_compute_any_function").attr('src', 'images/arrow.png');
};
$('#toc_a_visual_proof_that_neural_nets_can_compute_any_function').toggle('fast', function() {});
});</script><p class='toc_mainchapter'><a id="toc_why_are_deep_neural_networks_hard_to_train_reveal" class="toc_reveal" onMouseOver="this.style.borderBottom='1px solid #2A6EA6';" onMouseOut="this.style.borderBottom='0px';"><img id="toc_img_why_are_deep_neural_networks_hard_to_train" src="images/arrow.png" width="15px"></a><a href="chap5.html">ニューラルネットワークを訓練するのはなぜ難しいのか</a><div id="toc_why_are_deep_neural_networks_hard_to_train" style="display: none;"><p class="toc_section"><ul><a href="chap5.html#the_vanishing_gradient_problem"><li>The vanishing gradient problem</li></a><a href="chap5.html#what's_causing_the_vanishing_gradient_problem_unstable_gradients_in_deep_neural_nets"><li>What's causing the vanishing gradient problem? Unstable gradients in deep neural nets</li></a><a href="chap5.html#unstable_gradients_in_more_complex_networks"><li>Unstable gradients in more complex networks</li></a><a href="chap5.html#other_obstacles_to_deep_learning"><li>Other obstacles to deep learning</li></a></ul></p></div>
<script>
$('#toc_why_are_deep_neural_networks_hard_to_train_reveal').click(function() {
var src = $('#toc_img_why_are_deep_neural_networks_hard_to_train').attr('src');
if(src == 'images/arrow.png') {
$("#toc_img_why_are_deep_neural_networks_hard_to_train").attr('src', 'images/arrow_down.png');
} else {
$("#toc_img_why_are_deep_neural_networks_hard_to_train").attr('src', 'images/arrow.png');
};
$('#toc_why_are_deep_neural_networks_hard_to_train').toggle('fast', function() {});
});</script>
<p class='toc_mainchapter'><a id="toc_deep_learning_reveal" class="toc_reveal" onMouseOver="this.style.borderBottom='1px solid #2A6EA6';" onMouseOut="this.style.borderBottom='0px';"><img id="toc_img_deep_learning" src="images/arrow.png" width="15px"></a><a href="chap6.html">深層学習</a><div id="toc_deep_learning" style="display: none;"><p class="toc_section"><ul><a href="chap6.html#introducing_convolutional_networks"><li>Introducing convolutional networks</li></a><a href="chap6.html#convolutional_neural_networks_in_practice"><li>Convolutional neural networks in practice</li></a><a href="chap6.html#the_code_for_our_convolutional_networks"><li>The code for our convolutional networks</li></a><a href="chap6.html#recent_progress_in_image_recognition"><li>Recent progress in image recognition</li></a><a href="chap6.html#other_approaches_to_deep_neural_nets"><li>Other approaches to deep neural nets</li></a><a href="chap6.html#on_the_future_of_neural_networks"><li>On the future of neural networks</li></a></ul></p></div>
<script>
$('#toc_deep_learning_reveal').click(function() {
var src = $('#toc_img_deep_learning').attr('src');
if(src == 'images/arrow.png') {
$("#toc_img_deep_learning").attr('src', 'images/arrow_down.png');
} else {
$("#toc_img_deep_learning").attr('src', 'images/arrow.png');
};
$('#toc_deep_learning').toggle('fast', function() {});
});</script>
<p class="toc_not_mainchapter"><a href="sai.html">
Appendix: 知性のある <i>シンプルな</i> アルゴリズムはあるか?</a></p>
<p class="toc_not_mainchapter"><a href="acknowledgements.html">Acknowledgements</a></p><p class="toc_not_mainchapter"><a href="faq.html">Frequently Asked Questions</a></p>
<hr>
<span class="sidebar_title">Sponsors</span>
<br/>
<a href='http://www.ersatz1.com/'><img src='assets/ersatz.png' width='140px' style="padding: 0px 0px 10px 8px; border-style: none;"></a>
<a href='http://gsquaredcapital.com/'><img src='assets/gsquared.png' width='150px' style="padding: 0px 0px 10px 10px; border-style: none;"></a>
<a href='http://www.tineye.com'><img src='assets/tineye.png' width='150px'
style="padding: 0px 0px 10px 8px; border-style: none;"></a>
<a href='http://www.visionsmarts.com'><img
src='assets/visionsmarts.png' width='160px' style="padding: 0px 0px
0px 0px; border-style: none;"></a> <br/>
<!--
<p class="sidebar">Thanks to all the <a
href="supporters.html">supporters</a> who made the book possible.
Thanks also to all the contributors to the <a
href="bugfinder.html">Bugfinder Hall of Fame</a>. </p>
<p class="sidebar">The book is currently a beta release, and is still
under active development. Please send error reports to
mn@michaelnielsen.org. For other enquiries, please see the <a
href="faq.html">FAQ</a> first.</p>
-->
<p class="sidebar">著者と共にこの本を作り出してくださった<a
href="supporters.html">サポーター</a>の皆様に感謝いたします。
また、<a
href="bugfinder.html">バグ発見者の殿堂</a>に名を連ねる皆様にも感謝いたします。
また、日本語版の出版にあたっては、<a
href="translators.html">翻訳者</a>の皆様に深く感謝いたします。
</p>
<p class="sidebar">この本は目下のところベータ版で、開発続行中です。
エラーレポートは mn@michaelnielsen.org まで、日本語版に関する質問は muranushi@gmail.com までお送りください。
その他の質問については、まずは<a
href="faq.html">FAQ</a>をごらんください。</p>
<hr>
<span class="sidebar_title">Resources</span>
<p class="sidebar">
<a href="https://github.com/mnielsen/neural-networks-and-deep-learning">Code repository</a></p>
<p class="sidebar">
<a href="http://eepurl.com/BYr9L">Mailing list for book announcements</a>
</p>
<p class="sidebar">
<a href="http://eepurl.com/0Xxjb">Michael Nielsen's project announcement mailing list</a>
</p>
<hr>
<a href="http://michaelnielsen.org"><img src="assets/Michael_Nielsen_Web_Small.jpg" width="160px" style="border-style: none;"/></a>
<p class="sidebar">
著:<a href="http://michaelnielsen.org">Michael Nielsen</a> / 2014年9月-12月 <br > 訳:<a href="https://github.com/nnadl-ja/nnadl_site_ja">「ニューラルネットワークと深層学習」翻訳プロジェクト</a>
</p>
</div>
</p>
<p>
<!--Ó
In the <a href="chap5.html">last chapter</a> we learned that deep neural networks are often much harder to train than shallow neural networks.That's unfortunate, since we have good reason to believe that<em>if</em> we could train deep nets they'd be much more powerful than shallow nets. But while the news from the last chapter is discouraging, we won't let it stop us. In this chapter, we'll develop techniques which can be used to train deep networks, and apply them in practice. We'll also look at the broader picture, briefly reviewing recent progress on using deep nets for image recognition, speech recognition, and other applications. And we'll take a brief, speculative look at what the future may hold for neural nets, and for artificial intelligence.-->
<a href="chap5.html">前章</a>で、深いニューラルネットワークを訓練するのは、浅いネットワークを訓練する場合よりもずっと難しいことを学びました。
これは悲しいことです。
なぜなら、<em>もし</em>深いネットワークを上手く訓練できれば、浅いネットワークよりも遥かに強力になるからです。
前章の知らせは残念ですが、私たちは歩みを止めません。
この章では、深層ネットワークの訓練に使えるテクニックを発展させ、実践的な課題へ適用していきます。
また、深層ネットワークの幅広い応用例として、画像認識や音声認識などに関する最新結果を簡単に紹介します。
そして、ニューラルネットワークや人工知能の未来に何が待っているのか、についても予測していきます。
</p>
<p>
<!--The chapter is a long one. To help you navigate, let's take a tour. The sections are only loosely coupled, so provided you have some basic familiarity with neural nets, you can jump to whatever most interests you.-->
この章はとても長いです。
章の全体を軽く案内しましょう。
各セクション間の繋がりは強くはありません。
ですので、ニューラルネットワークに既に少し馴染みがあるなら、興味のあるセクションへ先に飛ぶのもよいでしょう。
</p>
<p>
<!--
The <a href="#convolutional_networks">main part of the chapter</a> is an introduction to one of the most widely used types of deep network:deep convolutional networks. We'll work through a detailed example- code and all - of using convolutional nets to solve the problem of classifying handwritten digits from the MNIST data set:-->
<a href="#convolutional_networks">この章の主要なテーマ</a>は、幅広く使われている深層ネットワークの一種である、深層畳み込みネットワークの紹介です。
MNISTの手書き数字の分類問題に対して、畳み込みネットワークを駆使して挑んで行く様子を、コードを交えながら詳細に追っていきます。
</p><p><center><img src="images/digits.png" width="160px"></center></p>
<p>
<!--We'll start our account of convolutional networks with the shallow networks used to attack this problem earlier in the book. Through many iterations we'll build up more and more powerful networks. As we go we'll explore many powerful techniques: convolutions, pooling, the use of GPUs to do far more training than we did with our shallow networks, the algorithmic expansion of our training data (to reduce overfitting), the use of the dropout technique (also to reduce overfitting), the use of ensembles of networks, and others. The result will be a system that offers near-human performance. Of the 10,000 MNIST test images - images not seen during training! - our system will classify 9,967 correctly. Here's a peek at the 33 images which are misclassified. Note that the correct classification is in the top right; our program's classification is in the bottom right:-->
畳み込みネットワークの説明に際しては、
本書で扱ってきた浅いネットワークと比較しながら進めます。
試行錯誤により、ネットワークをいじりながら作り上げていきます。
その過程でたくさんの強力なテクニックを学ぶでしょう。
畳み込み、プーリング、(浅いネットワークの場合よりも効率的に訓練するための)GPUの使用、(過適合の抑制のための)訓練データの拡張、(過適合の抑制のための)ドロップアウト、ネットワークのアンサンブルなどを学んでいきます。
これらを組み合わせると最終的に、人間に近いパフォーマンスを出せるシステムが出来上がります。
10,000個のMNISTテスト画像(これらは訓練画像には含まれません!)から、9,967個を正しく分類できるようになります。
誤って分類した33個の画像をちらっと見てみましょう。
正しい分類が手書き数字の右上に表示されており、私たちのプログラムが分類した結果が右下に表示されています。
</p>
<p>
<center><img src="images/ensemble_errors.png" width="580px"></center></p><p>
<!--Many of these are tough even for a human to classify. Consider, for example, the third image in the top row. To me it looks more like a "9" than an "8", which is the official classification. Our network also thinks it's a "9". This kind of "error" is at the very least understandable, and perhaps even commendable. We conclude our discussion of image recognition with a <a href="#recent_progress_in_image_recognition">survey of some of the spectacular recent progress</a> using networks (particularly convolutional nets) to do image recognition.-->
人間でも正しく分類するのは難しい画像が多いです。
例えば、上の行の3つ目の画像を見てください。
正解は"8"ですが、私には"8"よりは"9"に見えます。
私たちのネットワークも"9"と判断しています。
この類の"間違い"は許容できるもので、むしろこの間違いを犯せるのは立派ではないかとさえ思えます。
画像認識の議論のまとめとして、畳み込みネットワークを使用した<a href="#recent_progress_in_image_recognition">最近の目まぐるしい研究成果を調査します</a>。
</p>
<p>
<!--
The remainder of the chapter discusses deep learning from a broader and less detailed perspective. We'll<a href="#things_we_didn't_cover_but_which_you'll_eventually_want_to_know">briefly survey other models of neural networks</a>, such as recurrent neuralnets and long short-term memory units, and how such models can be applied to problems in speech recognition, natural language processing, and other areas. And we'll<a href="#on_the_future_of_neural_networks">speculate about the future of neural networks and deep learning</a>, ranging from ideas like intention-driven user interfaces, to the role of deep learning inartificial intelligence.-->
この章の最後では、大局的にディープラーニングを概観します。
具体的には、再帰型ニューラルネットワーク(RNN)や長期短期記憶(LSTM)ユニットなどの<a href="#things_we_didn't_cover_but_which_you'll_eventually_want_to_know">他のニューラルネットワークのモデルを簡単に調査</a>して、
そのようなモデルが音声認識や自然言語処理や他の分野の問題にどう適用可能であるのか考察します。
そして、意思だけで使えるユーザインターフェイスから、人工知能におけるディープラーニングの役割まで幅広く扱い、<a href="#on_the_future_of_neural_networks">ニューラルネットワークとディープラーニングの未来を予測</a>します。
</p>
</p><p></p><p></p><p></p><p></p><p></p><p></p><p>
<!--The chapter builds on the earlier chapters in the book, making use of and integrating ideas such as backpropagation, regularization, the softmax function, and so on. However, to read the chapter you don't need to have worked in detail through all the earlier chapters. It will, however, help to have read <a href="chap1.html">Chapter 1</a>, on the basics of neural networks. When I use concepts from Chapters 2 to 5,I provide links so you can familiarize yourself, if necessary.-->
この章は、本書のこれまでの章の内容の集大成です。
例えば、逆伝播、正規化、ソフトマックス関数などのアイデアを組み合わせてネットワークに利用します。
ですがこの章を読むのに、前章までを詳細に読み切る必要はありません。
ただし<a href="chap1.html">1章</a>を読んで、ニューラルネットワークの基礎を抑えておくのは役に立つでしょう。
2章から5章までのアイデアを利用するときには、必要であれば飛べるようにリンクを表示します。
</p>
<p>
<!--
It's worth noting what the chapter is not. It's not a tutorial on the latest and greatest neural networks libraries. Nor are we going to be training deep networks with dozens of layers to solve problems at the very leading edge. Rather, the focus is on understanding some of the core principles behind deep neural networks, and applying them in the simple, easy-to-understand context of the MNIST problem. Put another way: the chapter is not going to bring you right up to the frontier. Rather, the intent of this and earlier chapters is to focus on fundamentals, and so to prepare you to understand a wide range of current work.-->
この章では扱わないトピックを明確化しておきます。
まず、ニューラルネットワークの素晴らしい最新ライブラリのチュートリアルではありません。
また、数十の深層ネットワークを、巨大な計算機を使って訓練することで最先端の問題を解く、というようなトピックも扱いません。
それよりむしろ、深層ニューラルネットワークの根源的な原理を理解することに焦点を当て、その原理をシンプルで理解しやすいMNISTの問題に適用します。
繰り返すと、この章を読んでも最先端の流行には辿り着けません。
しかし、この章と以前の全章を読むことであなたは深層ニューラルネットワークの本質に触れることができ、いずれは現在の流行を理解できるようになるでしょう。
</p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p>
<p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p>
<h3><a name="introducing_convolutional_networks"></a><a href="#introducing_convolutional_networks"><!--Introducing convolutional networks-->畳み込みニューラルネットワークの導入</a></h3></p>
<p><!--In earlier chapters, we taught our neural networks to do a pretty good job recognizing images of handwritten digits:
-->
以前の章では、ニューラルネットワークの、手書き数字画像の認識精度を向上することを目的としていました。
</p>
<p>
<center><img src="images/digits.png" width="160px"></center>
</p>
<p>
<!--We did this using networks in which adjacent network layers are fully connected to one another. That is, every neuron in the network is connected to every neuron in adjacent layers:-->
この目的のために、隣接層がお互いに全結合するネットワークを使用していました。
これは、ネットワーク内の全てのニューロンが、隣接する層の全てのニューロンと結合している状態です。
</p>
<p>
<center><img src="images/tikz41.png"/></center>
</p>
<p>
<!--
In particular, for each pixel in the input image, we encoded the pixel's intensity as the value for a corresponding neuron in the input layer. For the $28 \times 28$ pixel images we've been using, this means our network has $784$ ($= 28 \times 28$) input neurons. We then trained the network's weights and biases so that the network's output would - we hope! - correctly identify the input image: '0', '1','2', ..., '8', or '9'.-->
さらに、入力画像の各ピクセルの強度を、入力層内の対応するニューロンへエンコードしていました。
これはつまり、使用した $28 \times 28$ ピクセルの画像の場合、ネットワークは $784$ ($= 28 \times 28$) の入力ニューロンを持つということです。
そして、ネットワークの重みとバイアスを訓練することで、入力画像が'0', '1','2', ..., '8', '9'のいずれであるかを、ネットワークの出力から(望みどおり!)特定しようとしました。
</p>
<p>
<!--
Our earlier networks work pretty well: we've
<a href="chap3.html#98percent">obtained a classification accuracy better
than 98 percent</a>, using training and test data from the
<a href="chap1.html#learning_with_gradient_descent">MNIST handwritten
digit data set</a>. But upon reflection, it's strange to use networks
with fully-connected layers to classify images. The reason is that
such a network architecture does not take into account the spatial
structure of the images. For instance, it treats input pixels which
are far apart and close together on exactly the same footing. Such
concepts of spatial structure must instead be inferred from the
training data. But what if, instead of starting with a network
architecture which is <em>tabula rasa</em>, we used an architecture
which tries to take advantage of the spatial structure? In this
section I describe <em>convolutional neural networks</em>*
-->
これまで作ってきたネットワークは上手く動いていました。
<a href="chap1.html#learning_with_gradient_descent">MNISTの手書き数字データセット</a>から取り出した訓練データとテストデータを使って、<a href="chap3.html#98percent">98%以上の分類精度を達成</a>していたのを覚えているでしょうか。
しかしよく考えると、画像を分類するのに全結合層からなるネットワークを使うのは変です。
なぜかというと、全結合層からなるネットワークは、画像の空間的な構造を考慮していないからです。
たとえば全結合層では、入力ピクセルの中の離れたところにあるもの同士と、近いところにあるもの同士が全く同等に扱われます。
そのような空間的な構造の概念自体、全結合層のネットワークの場合、全て訓練データから推測されなければなりません。
しかし、<em>真っさらな状態</em>のネットワーク構造からスタートする代わりに、空間構造を活用したネットワーク構造を使ったとしたらどうでしょう?
このセクションでは、<em>畳み込みニューラルネットワーク</em>を扱います。
<!--
<span class="marginnote">
*The
origins of convolutional neural networks go back to the 1970s. But
the seminal paper establishing the modern subject of convolutional
networks was a 1998 paper,
<a href="http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf">"Gradient-based
learning applied to document recognition"</a>, by Yann LeCun,
Léon Bottou, Yoshua Bengio, and Patrick Haffner.
LeCun has since made an interesting
<a href="https://www.facebook.com/yann.lecun/posts/10152348155137143">remark</a>
on the terminology for convolutional nets: "The [biological] neural
inspiration in models like convolutional nets is very
tenuous. That's why I call them 'convolutional nets' not
'convolutional neural nets', and why we call the nodes 'units' and
not 'neurons' ". Despite this remark, convolutional nets use many
of the same ideas as the neural networks we've studied up to now:
ideas such as backpropagation, gradient descent, regularization,
non-linear activation functions, and so on. And so we will follow
common practice, and consider them a type of neural network. I will
use the terms "convolutional neural network" and "convolutional
net(work)" interchangeably. I will also use the terms
"[artificial] neuron" and "unit" interchangeably.</span>.-->
<span class="marginnote">
*畳み込みニューラルネットワークのはじまりは、1970年代まで遡ります。
しかし、近年の畳み込みニューラルネットワークブームの発端の論文は1998年のby Yann LeCun, Léon Bottou, Yoshua Bengio, Patrick Haffnerによる<a href="http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf">"Gradient-based learning applied to document recognition"</a>です。
LeCunは畳み込みネットワークの用語定義に関して興味深い<a href="https://www.facebook.com/yann.lecun/posts/10152348155137143">次のような発言</a>を残しています。
「畳み込みネットワークのモデルは、生物学の神経モデルからはあまり着想を得ていません。そのため私は、"畳み込みニューラルネットワーク"ではなく"畳み込みネットワーク"と呼んでいます。そして、ノードに対しても"ニューロン"ではなく"ユニット"と呼んでいます」と。
この発言に反して、畳み込みネットワークは、私たちが学んできたニューラルネットワークと同じアイデアを多く利用しています。
例えば、逆伝播や勾配降下、正規化、非線形な活性化関数などです。
なので、慣例に従い、これからはニューラルネットワークの1種とみなします。
"畳み込みニューラルネットワーク"という用語と"畳込みネットワーク"という用語を同じ意味で使っていきます。
"(人工)ニューロン"や"ユニット"という用語も同義として使っていきます。
</span>
<!--These networks use a special architecture which is particularly well-adapted to classify images. Using this architecture makes convolutional networks fast to train. This, in turn, helps us train deep, many-layer networks, which are very good at classifying images.
Today, deep convolutional networks or some close variant are used in
most neural networks for image recognition.-->
畳み込みネットワークは、空間的構造性を考慮した設計となっており、画像分類に非常に適しています。
この特性により、畳込みネットワークは効率的に学習できるのです。
つまり、画像を分類するのに優れた、深くて多層のネットワークを訓練できると言えます。
今日、深層の畳み込みネットワークもしくは類似のネットワークが、画像認識を目的とするニューラルネットワークの大半に使われています。
</p>
<p>
<!--Convolutional neural networks use three basic ideas: <em>local
receptive fields</em>, <em>shared weights</em>, and <em>pooling</em>. Let's
look at each of these ideas in turn.-->
畳み込みニューラルネットワークは次の3つの重要なアイデアを使っています。
それは、<em>局所受容野</em>、<em>重み共有</em>、<em>プーリング</em>です。
各アイデアを順に見ていきましょう。
</p>
<p>
<!--
<strong>Local receptive fields:</strong> In the fully-connected layers shown
earlier, the inputs were depicted as a vertical line of neurons. In a
convolutional net, it'll help to think instead of the inputs as a $28
\times 28$ square of neurons, whose values correspond to the $28
\times 28$ pixel intensities we're using as inputs:
-->
<strong>局所受容野:</strong>
上で確認した全結合層では、入力は一列のニューロンとして描かれていました。
一方、畳み込みネットワークでは、入力を $28 \times 28$ の正方形のニューロンと考えます。
各ニューロンの値は、入力として用いる $28 \times 28$ の入力ピクセルの強さに対応します。
</p>
<p>
<center>
<img src="images/tikz42.png"/>
</center>
</p>
<p>
<!--
As per usual, we'll connect the input pixels to a layer of hidden
neurons. But we won't connect every input pixel to every hidden
neuron. Instead, we only make connections in small, localized regions
of the input image.
-->
いつも通り、入力のピクセルを隠れ層のニューロンに結合します。
しかし、隠れ層の各ニューロンへ、各入力ピクセルを結びつけることはしません。
代わりに、各ニューロンへ入力画像の中の小さい局所領域を結合します。
</p>
<p>
<!--
To be more precise, each neuron in the first hidden layer will be
connected to a small region of the input neurons, say, for example, a
$5 \times 5$ region, corresponding to $25$ input pixels. So, for a
particular hidden neuron, we might have connections that look like
this:
-->
正確に言うと、1つ目の隠れ層の各ニューロンは、入力ニューロンの小さい領域と結合します。
例えば、入力の $25$ ピクセルに対応する $5 \times 5$ の領域に、隠れ層の各ニューロンが結合します。
ある隠れニューロン結合を示すと次のようになります。
<center>
<img src="images/tikz43.png"/>
</center>
</p>
<p>
<!--
That region in the input image is called the <em>local receptive
field</em> for the hidden neuron. It's a little window on the input
pixels. Each connection learns a weight. And the hidden neuron
learns an overall bias as well. You can think of that particular
hidden neuron as learning to analyze its particular local receptive
field.
-->
入力画像内のそのような領域は、隠れニューロンの<em>局所受容野</em>と呼ばれます。
入力ピクセル上の小さな窓のようなものです。
各結合は重みを学習します。
隠れニューロンはバイアスも同じく学習します。
特定の隠れニューロンは、特定の局所受容野を分析しているとみなせます。
</p>
<p>
<!--
We then slide the local receptive field across the entire input image.
For each local receptive field, there is a different hidden neuron in
the first hidden layer. To illustrate this concretely, let's start
with a local receptive field in the top-left corner:
-->
そして、入力画像全体をカバーするように局所受容野をスライドさせます。
局所受容野ごとに、1つ目の隠れ層の中で異なる隠れニューロンが割り当てられます。
これを具体的に確認してみます。
左上の角の局所受容野から始めてみましょう。
<center>
<img src="images/tikz44.png"/>
</center>
</p>
<p>
<!--
Then we slide the local receptive field over by one pixel to the right
(i.e., by one neuron), to connect to a second hidden neuron:
-->
1ピクセル分(すなわち1ニューロン分)局所受容野を右へスライドして、次は2つ目の隠れニューロンの結合を考えます。
</p>
<p>
<center>
<img src="images/tikz45.png"/>
</center>
</p>
<p>
<!--
And so on, building up the first hidden layer. Note that if we have a
$28 \times 28$ input image, and $5 \times 5$ local receptive fields,
then there will be $24 \times 24$ neurons in the hidden layer. This
is because we can only move the local receptive field $23$ neurons
across (or $23$ neurons down), before colliding with the right-hand
side (or bottom) of the input image.
-->
これを繰り返して、最初の隠れ層の全体に対して値を設定します。
入力画像のサイズが $28 \times 28$ で、局所受容野のサイズが $5 \times 5$ の場合、1つ目の隠れ層のニューロンは $24 \times 24$ 個となります。
その理由は、入力画像の右側(もしくは下側)にぶつかるまでに、$23$ 個のニューロン分だけ局所受容野をスライドできるからです。
</p>
<p>
<!--I've shown the local receptive field being moved by one pixel at a
time. In fact, sometimes a different <em>stride length</em> is used.
For instance, we might move the local receptive field $2$ pixels to
the right (or down), in which case we'd say a stride length of $2$ is
used. In this chapter we'll mostly stick with stride length $1$, but
it's worth knowing that people sometimes experiment with different
stride lengths*-->
ここまで、$1$ ピクセルずつ局所受容野が移動する例を見てきました。
実は、<em>ストライドの長さ</em>に $1$ 以外の値が使われることがしばしばあります。
たとえば、$2$ ピクセルずつ局所受容野を右へ(もしくは下へ)動かすこともあるでしょう。
これは、$2$ ピクセルのストライド長さが使われていると言えます。
この章では大抵、ストライドの長さが $1$ の場合しか扱いませんが、
時には異なるストライド長さ*が使用されて実験が行われる場合もあることは知っておいてください。
<span class="marginnote">
<!--
*As was done in earlier chapters, if we're
interested in trying different stride lengths then we can use
validation data to pick out the stride length which gives the best
performance. For more details, see the
<a href="chap3.html#how_to_choose_a_neural_network's_hyper-parameters">earlier
discussion</a> of how to choose hyper-parameters in a neural network.
The same approach may also be used to choose the size of the local
receptive field - there is, of course, nothing special about using
a $5 \times 5$ local receptive field. In general, larger local
receptive fields tend to be helpful when the input images are
significantly larger than the $28 \times 28$ pixel MNIST images.
-->
*以前の章で触れたように、異なるストライド長さを試したい場合、最適なパフォーマンスを発揮するストライド長さを決めるには、検証データを使うのがよいでしょう。
詳細は、ニューラルネットワークでハイパーパラメータを選ぶ方法についての<a href="chap3.html#how_to_choose_a_neural_network's_hyper-parameters">以前の議論</a>を確認してください。
同じアプローチが局所受容野のサイズを選ぶ時にも使われるでしょう。
もちろん、$5 \times 5$ の局所受容野を使う特別な理由はないのです。
一般的には、入力画像が $28 \times 28$ のMNIST画像よりもずっと大きい時には、大きいサイズの局所受容野を使って方が良い傾向があります。
</span>
</p>
<p>
<!--
<strong>Shared weights and biases:</strong> I've said that each hidden neuron
has a bias and $5 \times 5$ weights connected to its local receptive
field. What I did not yet mention is that we're going to use the
<em>same</em> weights and bias for each of the $24 \times 24$ hidden
neurons. In other words, for the $j, k$th hidden neuron, the output
is:
<a class="displaced_anchor" name="eqtn125"></a>\begin{eqnarray}
\sigma\left(b + \sum_{l=0}^4 \sum_{m=0}^4 w_{l,m} a_{j+l, k+m} \right).
\tag{125}\end{eqnarray}
Here, $\sigma$ is the neural activation function - perhaps the
<a href="chap1.html#sigmoid_neurons">sigmoid function</a> we used in
earlier chapters. $b$ is the shared value for the bias. $w_{l,m}$ is
a $5 \times 5$ array of shared weights. And, finally, we use $a_{x,
y}$ to denote the input activation at position $x, y$.
-->
<strong>重みとバイアスの共有:</strong>
各隠れニューロンはバイアスと局所受容野に結合された $5 \times 5$ の重みを持つことを上で述べました。
しかし、$24 \times 24$ の全ての隠れニューロンに対して、<em>同じ</em>重みとバイアスを適用することをまだ伝えていませんでした。
これはつまり、$j, k$ 個目の隠れニューロンへの出力は、下記のようになることを示しています。
<a class="displaced_anchor" name="eqtn125"></a>\begin{eqnarray}
\sigma\left(b + \sum_{l=0}^4 \sum_{m=0}^4 w_{l,m} a_{j+l, k+m} \right).
\tag{125}\end{eqnarray}
$\sigma$ は活性化関数の一種であり、以前の章で使用した<a href="chap1.html#sigmoid_neurons">シグモイド関数</a>です。
$b$ はバイアスの共有値です。
$w_{l,m}$ は共有重みであり、そのサイズは $5 \times 5$ です。
そして、$a_{x, y}$ は $x, y$ における活性化された入力を示します。
</p>
<p>
<!--This means that all the neurons in the first hidden layer detect
exactly the same feature*<span class="marginnote">
*I haven't precisely defined the
notion of a feature. Informally, think of the feature detected by a
hidden neuron as the kind of input pattern that will cause the
neuron to activate: it might be an edge in the image, for instance,
or maybe some other type of shape. </span>, just at different locations in
the input image. To see why this makes sense, suppose the weights and
bias are such that the hidden neuron can pick out, say, a vertical
edge in a particular local receptive field. That ability is also
likely to be useful at other places in the image. And so it is useful
to apply the same feature detector everywhere in the image. To put it
in slightly more abstract terms, convolutional networks are well
adapted to the translation invariance of images: move a picture of a
cat (say) a little ways, and it's still an image of a cat*-->
このことが意味するのは、入力画像の異なる位置の全く同じ特徴*を、1層目の隠れ層が検知するということです。
<span class="marginnote">
*まだ特徴の厳密な定義をしていませんでした。
砕けた言い方をすると、隠れニューロンに検知される特徴とは、ニューロンを活性化する入力パターンの種類を意味します。
そのパターンとは例えば、画像のエッジだったり他の形状だったりします。
</span>
なぜこれが成り立つのかを理解するために、
隠れニューロンが縦のエッジを局所受容野に検知できるような、重みやバイアスを想定してみてください。
この検知能力は、画像の他の位置でも有効に使えそうです。
したがって、同じ特徴検出器を画像の全位置へ適用するのは有効と言えるのです。
少し抽象的に表現すると、畳込みニューラルネットワークは画像に対して並進不変性があると言います。
並進不変性とは例えば、猫の絵を少し並進移動しても、それはまだ猫の絵と言えるような性質のことです*
<!--
<span class="marginnote">
*In
fact, for the MNIST digit classification problem we've been
studying, the images are centered and size-normalized. So MNIST has
less translation invariance than images found "in the wild", so to
speak. Still, features like edges and corners are likely to be
useful across much of the input space. </span>.
-->
<span class="marginnote">
*私たちが勉強してきたMNIST手書き数字の分類問題では、画像は中央に寄っており、大きさが正規化されていました。
なので、MNISTは世の中にある画像よりも、並進不変性が小さいと言える。
しかしそれでも、エッジや角といった特徴は入力空間全体において有効に使えるでしょう</span>。
</p>
<p>
<!--
For this reason, we sometimes call the map from the input layer to the
hidden layer a <em>feature map</em>. We call the weights defining the
feature map the <em>shared weights</em>. And we call the bias defining
the feature map in this way the <em>shared bias</em>. The shared
weights and bias are often said to define a <em>kernel</em> or
<em>filter</em>. In the literature, people sometimes use these terms in
slightly different ways, and for that reason I'm not going to be more
precise; rather, in a moment, we'll look at some concrete examples.
-->
この理由から、入力層から隠れ層への写像を<em>特徴マップ</em>と呼ぶこともあります。
特徴マップを定義する重みを<em>共有重み</em>と呼びます。
また、特徴マップを同じように定義するバイアスを、同じように<em>共有バイアス</em>と呼びます。
共有重みと共有バイアスはしばしば、<em>カーネル</em>、もしくは<em>フィルタ</em>と呼ばれます。
文献では、これらの用語を少し異なる使い方をする場合があります。
そのため、私は用語の正確性は放棄しています。
むしろ具体例で確認することのほうが本質的なので、そのように心がけていきます。
</p>
<p>
</p>
<p>
<!--The network structure I've described so far can detect just a single
kind of localized feature. To do image recognition we'll need more
than one feature map. And so a complete convolutional layer consists
of several different feature maps:-->
これまで扱ってきたネットワーク構造は、一種類の局所的特徴のみ検知できるものでした。
画像認識のためには、二つ以上の特徴マップが必要となります。
したがって、完全な畳込み層は幾つかの異なる特徴マップから構成されるのです。
</p>
<p>
<center>
<img src="images/tikz46.png"/>
</center>
<!--
In the example shown, there are $3$ feature maps. Each feature map is
defined by a set of $5 \times 5$ shared weights, and a single shared
bias. The result is that the network can detect $3$ different kinds
of features, with each feature being detectable across the entire
image.-->
上の例には 三つの特徴マップがあります。
それぞれの特徴マップは $5 \times 5$ の共有重みと共有バイアスで定義されています。
その結果、三種の異なる特徴を、画像全体に渡って検知できるのです。
</p>
<p>
</p>
<p>
<!--
I've shown just $3$ feature maps, to keep the diagram above simple.
However, in practice convolutional networks may use more (and perhaps
many more) feature maps. One of the early convolutional networks,
LeNet-5, used $6$ feature maps, each associated to a $5 \times 5$
local receptive field, to recognize MNIST digits. So the example
illustrated above is actually pretty close to LeNet-5. In the
examples we develop later in the chapter we'll use convolutional
layers with $20$ and $40$ feature maps. Let's take a quick peek at
some of the features which are learned*<span class="marginnote">
*The feature maps
illustrated come from the final convolutional network we train, see
<a href="#final_conv">here</a>.</span>:
-->
図をシンプルにするために、 $3$ つの特徴マップだけを見せました。
しかし、実際の畳み込みネットワークは(たぶん遥かに)多くの特徴マップを使っているかもしれません。
初期の畳み込みネットワークであるLeNet-5は、MNISTの手書き数字を認識するために $6$ つの特徴マップを使っていました。
各特徴マップは $5 \times 5$ の局所受容野と結合しています。
したがって、上記の例はLeNet-5と実際かなり近いのです。
章の後ろの方で開発するネットワークでは、 $20$ と $40$ の特徴マップをそれぞれ持つ畳み込み層を使っています。
その特徴マップを少し覗き見してみましょう*<span class="marginnote">
*図の特徴マップは私たちが訓練する最後の畳み込みネットワークに含まれるものです。<a href="#final_conv">ここ</a>を確認してください。</span>
</p>
<p>
<center><img src="images/net_full_layer_0.png" width="400px"></center>
</p>
<p>
<!--The $20$ images correspond to $20$ different feature maps (or filters,
or kernels). Each map is represented as a $5 \times 5$ block image,
corresponding to the $5 \times 5$ weights in the local receptive
field. Whiter blocks mean a smaller (typically, more negative)
weight, so the feature map responds less to corresponding input
pixels. Darker blocks mean a larger weight, so the feature map
responds more to the corresponding input pixels. Very roughly
speaking, the images above show the type of features the convolutional
layer responds to.-->
$20$ 個の画像は $20$ 個の異なる特徴マップ(もしくはフィルタかカーネル)に対応しています。
各マップは、 $5 \times 5$ ブロック画像で表され、局所受容野の $5 \times 5$ の重みに対応しています。
白いブロックは小さい(概してマイナスの)重みを意味し、その特徴マップは入力ピクセルに反応しにくいという性質を持ちます。
一方、黒いブロックは大きい重みを意味し、その特徴マップは入力ピクセルによく反応します。
大まかに言うと、畳み込み層がどのような種類の特徴に反応するかを、上の画像群は示しています。
</p>
<p>
<!--
So what can we conclude from these feature maps? It's clear there is
spatial structure here beyond what we'd expect at random: many of the
features have clear sub-regions of light and dark. That shows our
network really is learning things related to the spatial structure.
However, beyond that, it's difficult to see what these feature
detectors are learning. Certainly, we're not learning (say) the
<a href="http://en.wikipedia.org/wiki/Gabor_filter">Gabor filters</a> which
have been used in many traditional approaches to image recognition.
In fact, there's now a lot of work on better understanding the
features learnt by convolutional networks. If you're interested in
following up on that work, I suggest starting with the paper
<a href="http://arxiv.org/abs/1311.2901">Visualizing and Understanding
Convolutional Networks</a> by Matthew Zeiler and Rob Fergus (2013).
-->
これらの特徴マップからどんな結論を導けるでしょうか?
何らかの空間的構造が特徴マップには現れているようです。
特徴マップの多くは明るい領域と暗い領域の両方を含んでいます。
これにより、空間的構造に関する特徴をネットワークが学習していることが分かります。
しかし、これらの特徴検出器が何を学んでいるのかを、それ以上に深く把握するのは難しいです。
明らかに、この特徴は画像認識の伝統的なアプローチでたくさん採用されてきた<a href="http://en.wikipedia.org/wiki/Gabor_filter">ガボールフィルタ</a>ではありません。
畳み込みネットワークの学習した特徴を、突き詰めて理解しようとする研究が、現在多数進行中です。
もし興味があるのなら、2013年のMatthew ZeilerとRob Fergusによる<a href="http://arxiv.org/abs/1311.2901">Visualizing and Understanding Convolutional Networks</a>を読むのを薦めます。</p>
<p></p>
<p>
<!--
A big advantage of sharing weights and biases is that it greatly
reduces the number of parameters involved in a convolutional network.
For each feature map we need $25 = 5 \times 5$ shared weights, plus a
single shared bias. So each feature map requires $26$ parameters. If
we have $20$ feature maps that's a total of $20 \times 26 = 520$
parameters defining the convolutional layer. By comparison, suppose
we had a fully connected first layer, with $784 = 28 \times 28$ input
neurons, and a relatively modest $30$ hidden neurons, as we used in
many of the examples earlier in the book. That's a total of $784
\times 30$ weights, plus an extra $30$ biases, for a total of $23,550$
parameters. In other words, the fully-connected layer would have more
than $40$ times as many parameters as the convolutional layer.
-->
重みとバイアスを共有する大きな利点は、畳込みネットワークのパラメータ数を大きく減らせる点です。
上記の畳み込みネットワークのパラメータを数えてみます。
特徴マップごとに $25 = 5 \times 5$ の共有重みと、1つの共有バイアスを必要とします。
つまり、各特徴マップは $26$ のパラメータが必要です。
$20$ 個の特徴マップがある場合には、畳込み層を定義するための全パラメータは $20 \times 26 = 520$ 個となります。
それと比較するために、全結合層のパラメータ数を数えてみます。
これまで本書で使ってきた例と同様に $784 = 28 \times 28$ 個のニューロンからなる入力層と、$30$ 個の隠れニューロンからなる全結合層で構成されるネットワークを仮定してみてください。
その場合、 $784 \times 30$ 個の重みとさらに $30$ 個のバイアスで、全部で $23,550$
個のパラメータからなります。
つまり、全結合層は畳み込み層と比べて $40$ 倍のパラメータを保持することになるのです。
</p>
<p>
<!--
Of course, we can't really do a direct comparison between the number
of parameters, since the two models are different in essential ways.
But, intuitively, it seems likely that the use of translation
invariance by the convolutional layer will reduce the number of
parameters it needs to get the same performance as the fully-connected
model. That, in turn, will result in faster training for the
convolutional model, and, ultimately, will help us build deep networks
using convolutional layers.-->
もちろん、根本的に2つのモデルは異なっているため、パラメータ数を直接比較することは本当はできません。
しかし直感的に考えてみても、畳み込み層には並進不変の性質があるので、全結合層のモデルと同じパフォーマンスを得るのに要するパラメータ数は少なくなると思えます。
パラメータ数が小さいおかげで、畳込みモデルは高速に訓練でき、層を深くできるのです。
</p>
<p>
</p>
<p>
<!--
Incidentally, the name <em>convolutional</em> comes from the fact that
the operation in Equation <span id="margin_903716135329_reveal" class="equation_link">(125)</span><span id="margin_903716135329" class="marginequation" style="display: none;"><a href="chap6.html#eqtn125" style="padding-bottom: 5px;" onMouseOver="this.style.borderBottom='1px solid #2A6EA6';" onMouseOut="this.style.borderBottom='0px';">\begin{eqnarray}
\sigma\left(b + \sum_{l=0}^4 \sum_{m=0}^4 w_{l,m} a_{j+l, k+m} \right) \nonumber\end{eqnarray}</a></span><script>$('#margin_903716135329_reveal').click(function() {$('#margin_903716135329').toggle('slow', function() {});});</script> is sometimes known as a
<em>convolution</em>. A little more precisely, people sometimes write
that equation as $a^1 = \sigma(b + w * a^0)$, where $a^1$ denotes the
set of output activations from one feature map, $a^0$ is the set of
input activations, and $*$ is called a convolution operation. We're
not going to make any deep use of the mathematics of convolutions, so
you don't need to worry too much about this connection. But it's
worth at least knowing where the name comes from.
-->
ところで、<em>畳み込み</em>という呼び名は<span id="margin_903716135329_reveal" class="equation_link">(125)</span><span id="margin_903716135329" class="marginequation" style="display: none;"><a href="chap6.html#eqtn125" style="padding-bottom: 5px;" onMouseOver="this.style.borderBottom='1px solid #2A6EA6';" onMouseOut="this.style.borderBottom='0px';">\begin{eqnarray}
\sigma\left(b + \sum_{l=0}^4 \sum_{m=0}^4 w_{l,m} a_{j+l, k+m} \right) \nonumber\end{eqnarray}</a></span><script>$('#margin_903716135329_reveal').click(function() {$('#margin_903716135329').toggle('slow', function() {});});</script>の、<em>畳み込み</em>という名で知られた操作に由来しています。
正確に式を記述すると、$a^1 = \sigma(b + w * a^0)$ となります。
ここで、 $a^1$ はある特徴マップからの活性化された出力、$a^0$ は活性化された入力、$*$ は畳み込みと呼ばれる操作を示します。
私たちは、いわゆる数学における畳込み操作を深く追い求めません。
なので、数学との結びつきを心配する必要はありません。
しかし、由来が何なのかは少なくとも知っておいて損はありません。
</p><p></p><p></p><p></p><p></p><p>
<!--
<strong>Pooling layers:</strong> In addition to the convolutional layers just
described, convolutional neural networks also contain <em>pooling
layers</em>. Pooling layers are usually used immediately after
convolutional layers. What the pooling layers do is simplify the
information in the output from the convolutional layer.
-->
<strong>プーリング層:</strong>
通常の畳み込みニューラルネットワークは、先ほどの畳み込み層に加えて、<em>プーリング層</em>も含みます。
このプーリング層は通常、畳込み層の直後に置かれます。
この層の役割は畳込み層の出力を単純化することです。
</p><p></p><p>
<!--
In detail, a pooling layer takes each feature map*<span class="marginnote">
*The
nomenclature is being used loosely here. In particular, I'm using
"feature map" to mean not the function computed by the
convolutional layer, but rather the activation of the hidden neurons
output from the layer. This kind of mild abuse of nomenclature is
pretty common in the research literature.</span> output from the
convolutional layer and prepares a condensed feature map. For
instance, each unit in the pooling layer may summarize a region of
(say) $2 \times 2$ neurons in the previous layer. As a concrete
example, one common procedure for pooling is known as
<em>max-pooling</em>. In max-pooling, a pooling unit simply outputs the
maximum activation in the $2 \times 2$ input region, as illustrated in
the following diagram:-->
少し詳しく説明すると、プーリング層は畳み込み層から各特徴マップ*を取得し、特徴マップを濃縮させています。<span class="marginnote">
*ここでの用語の定義ははっきりしていません。
私は「特徴マップ」という言葉を、畳み込み層から算出される関数を指して使うのではなく、活性化された出力ニューロンのことを指して使います。
この類の意味の揺れは、研究論文によくあることです。</span>
つまり、プーリング層の各ユニットは前層の $2 \times 2$ の領域のニューロンをまとめます。
具体的な手法を紹介すると、プーリングのよく知られた例として<em>Maxプーリング</em>があります。
Maxプーリングでは、プーリングのユニットは $2 \times 2$ の入力領域のうちで最大の値を単純に出力します。
次の図を見てください。
</p>
<p>
<center>
<img src="images/tikz47.png"/>
</center>
</p>
<p>
<!--
Note that since we have $24 \times 24$ neurons output from the
convolutional layer, after pooling we have $12 \times 12$ neurons.
-->
畳み込み層の出力ニューロンは $24 \times 24$ なので、プーリング処理後は $12 \times 12$ のサイズのニューロンとなります。
</p>
<p>
<!--As mentioned above, the convolutional layer usually involves more than
a single feature map. We apply max-pooling to each feature map
separately. So if there were three feature maps, the combined
convolutional and max-pooling layers would look like:
-->
上で述べた通り、畳み込み層は通常1つ以上の特徴マップを持ちます。
それらの特徴マップに対して個別にMaxプーリングを適用します。
したがって、3つ特徴マップがある場合には、畳込み層とMaxプーリング層の様子は次のようになります。
</p>
<p>
<center>
<img src="images/tikz48.png"/>
</center>
</p>
<p>
<!--
We can think of max-pooling as a way for the network to ask whether a
given feature is found anywhere in a region of the image. It then
throws away the exact positional information. The intuition is that
once a feature has been found, its exact location isn't as important
as its rough location relative to other features. A big benefit is
that there are many fewer pooled features, and so this helps reduce
the number of parameters needed in later layers.
-->
Maxプーリングは、画像のある領域内のどこかに指定の特徴があるかをネットワークが確認する手段とみなせます。
つまり正確な位置の情報は棄てているのです。
直感的に解釈すると、一度特徴が見つかればその正確な位置は重要でなく、他の特徴に対するおおよその位置さえ分かればよいということなのです。
この手法の大きな利点は、特徴はプーリングされると少なくなるため、後方の層で必要なパラメータを減らすことができる点です。
</p>
<p>
</p>
<p>
<!--
Max-pooling isn't the only technique used for pooling. Another common
approach is known as <em>L2 pooling</em>. Here, instead of taking the
maximum activation of a $2 \times 2$ region of neurons, we take the
square root of the sum of the squares of the activations in the $2
\times 2$ region. While the details are different, the intuition is
similar to max-pooling: L2 pooling is a way of condensing information
from the convolutional layer. In practice, both techniques have been
widely used. And sometimes people use other types of pooling
operation. If you're really trying to optimize performance, you may
use validation data to compare several different approaches to
pooling, and choose the approach which works best. But we're not
going to worry about that kind of detailed optimization.
-->
プーリングの手法はMaxプーリングだけではありません。
他のよく知られたアプローチとして<em>L2 プーリング</em>があります。
L2プーリングの手法では、 $2 \times 2$ 領域のニューロンの活性化出力の最大値をとるのではなく、
$2 \times 2$ 領域の活性化出力の和の平方根をとります。
L2プーリングは、畳み込み層からの情報を圧縮する方法とも言えます。
詳細な手続きは異なるものの、直感的にはMaxプーリングに近いはたらきをします。
実際、どちらの手法も広く使われてきました。
そして、場合によってはさらに別のプーリング手法も使われることもあります。
パフォーマンスを本気で良くしようと思ったら、検証データを使って異なるプーリング手法を試すのが良いでしょう。
そして、一番良い手法を選択するのです。
しかし私たちは、細かい最適化の種類を気にかけるつもりはありません。
</p><p></p><p>
<!--
<strong>Putting it all together:</strong> We can now put all these ideas
together to form a complete convolutional neural network. It's
similar to the architecture we were just looking at, but has the
addition of a layer of $10$ output neurons, corresponding to the $10$
possible values for MNIST digits ('0', '1', '2', <em>etc</em>):
-->
<strong>全てを1つにまとめる:</strong>
さあ、これまでのアイデアを全て使って、畳み込みニューラルネットワークを完成させましょう。
これから作るものは、上で見てきた構造と似ていますが、$10$ のニューロンを持つ出力層が追加されています。
この層の各ニューロンはMNISTの $10$ 種の手書き数字 ('0', '1', '2', <em>etc</em>) に対応するものです。
</p>
<p>
<center>
<img src="images/tikz49.png"/>
</center></p><p>
<!--
The network begins with $28 \times 28$ input neurons, which are used
to encode the pixel intensities for the MNIST image. This is then
followed by a convolutional layer using a $5 \times 5$ local receptive
field and $3$ feature maps. The result is a layer of $3 \times 24
\times 24$ hidden feature neurons. The next step is a max-pooling
layer, applied to $2 \times 2$ regions, across each of the $3$ feature
maps. The result is a layer of $3 \times 12 \times 12$ hidden feature
neurons.
-->
このネットワークは、MNIST画像のピクセル強度を符号化するのに使われる $28 \times 28$ の入力ニューロンから始まります。
そして、$5 \times 5$ の局所受容野と $3$ の特徴マップを使う畳み込み層が続きます。
この畳み込み層は $3 \times 24 \times 24$ の隠れ特徴ニューロンから構成されます。
次にMaxプーリング層が続きます。
この層では $2 \times 2$ の領域を $3$ の特徴マップごとに処理します。
つまりプーリング層は $3 \times 12 \times 12$ の隠れ特徴ニューロンからなります。
</p>
<p>
<!--
The final layer of connections in the network is a fully-connected
layer. That is, this layer connects <em>every</em> neuron from the
max-pooled layer to every one of the $10$ output neurons. This
fully-connected architecture is the same as we used in earlier
chapters. Note, however, that in the diagram above, I've used a
single arrow, for simplicity, rather than showing all the connections.
Of course, you can easily imagine the connections.
-->
ネットワークの最後の層は全結合層です。
Maxプーリング層の<em>全ての</em>ニューロンと この層の $10$ の出力ニューロンが個別に結合します。
この全結合の構造は以前の章で扱ったものと同じです。
しかし、上図では表記をシンプルにするため、全ての結合を表示する代わりに1つの矢印で表現しています。
結合の様子は容易に想像できるでしょう。
</p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p>
<!--
This convolutional architecture is quite different to the
architectures used in earlier chapters. But the overall picture is
similar: a network made of many simple units, whose behaviors are
determined by their weights and biases. And the overall goal is still
the same: to use training data to train the network's weights and
biases so that the network does a good job classifying input digits.
-->
この畳込み構造は、以前までの章で扱ってきた構造と大きく異なります。
しかし、全体像は似ています。
ネットワークは単純なユニットから構成され、各ユニットの振る舞いは重みとバイアスから決定されます。
全体の目標も同じです。
それは、訓練データによりネットワークの重みとバイアスを訓練して、ネットワークが入力画像を上手く分類できるようにすることです。
</p>
<p>
<!--
In particular, just as earlier in the book, we will train our network
using stochastic gradient descent and backpropagation. This mostly
proceeds in exactly the same way as in earlier chapters. However, we
do need to make a few modifications to the backpropagation procedure.
The reason is that our earlier <a href="chap2.html">derivation of
backpropagation</a> was for networks with fully-connected layers.
Fortunately, it's straightforward to modify the derivation for
convolutional and max-pooling layers. If you'd like to understand the
details, then I invite you to work through the following problem. Be
warned that the problem will take some time to work through, unless
you've really internalized the <a href="chap2.html">earlier derivation of
backpropagation</a> (in which case it's easy).
-->
また、以前の章と同じようにネットワークの訓練には、確率的勾配降下法と逆伝播を用います。
以前の章と殆ど同じです。
しかし、逆伝播の手続きには、少し修正を加える必要があります。
以前の章の<a href="chap2.html">逆伝播による偏微分導出</a>では、全結合層を対象とした手続きを扱っていたためです。
幸運なことに、畳込み層とMaxプーリング層の偏微分の式を導出するには、修正を少し加えるだけで済みます。
もし詳細を理解したければ、次の問題に取り組んだほうがよいでしょう。
ただし、<a href="chap2.html">逆伝播にる前方の層の偏微分</a>を正しく理解していない限り、この問題を解くには少し時間がかかります。
</p>
<p>
<h4><a name="problem_214396"></a><a href="#problem_214396"><!--Problem-->問題</a></h4><ul>
<li><strong><!--Backpropagation in a convolutional network-->畳み込みネットワークにおける逆伝播:</strong>
<!--The core equations
of backpropagation in a network with fully-connected layers
are-->
全結合層のネットワークにおける逆伝播の重要な式は
<span id="margin_709574921443_reveal" class="equation_link">(BP1)</span><span id="margin_709574921443" class="marginequation" style="display: none;"><a href="chap2.html#eqtnBP1" style="padding-bottom: 5px;" onMouseOver="this.style.borderBottom='1px solid #2A6EA6';" onMouseOut="this.style.borderBottom='0px';">\begin{eqnarray}
\delta^L_j = \frac{\partial C}{\partial a^L_j} \sigma'(z^L_j) \nonumber\end{eqnarray}</a></span><script>$('#margin_709574921443_reveal').click(function() {$('#margin_709574921443').toggle('slow', function() {});});</script>-<span id="margin_220452626963_reveal" class="equation_link">(BP4)</span><span id="margin_220452626963" class="marginequation" style="display: none;"><a href="chap2.html#eqtnBP4" style="padding-bottom: 5px;" onMouseOver="this.style.borderBottom='1px solid #2A6EA6';" onMouseOut="this.style.borderBottom='0px';">\begin{eqnarray}
\frac{\partial C}{\partial w^l_{jk}} = a^{l-1}_k \delta^l_j \nonumber\end{eqnarray}</a></span><script>$('#margin_220452626963_reveal').click(function() {$('#margin_220452626963').toggle('slow', function() {});});</script>
(<a href="chap2.html#backpropsummary">link</a>)でした。
<!--Suppose we have a
network containing a convolutional layer, a max-pooling layer, and a
fully-connected output layer, as in the network discussed above.
How are the equations of backpropagation modified?-->
上述のネットワークのように、畳み込み層、Maxプーリング層、全結合の出力層から構成されるネットワークを想定してください。
この時、逆伝播の式はどのように修正されるでしょうか?
</ul></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p>
<h3><a name="convolutional_neural_networks_in_practice"></a><a href="#convolutional_neural_networks_in_practice"><!--Convolutional neural networks in practice-->畳み込みニューラルネットワークの実際</a></h3></p>
<p>
<!--
We've now seen the core ideas behind convolutional neural networks.
Let's look at how they work in practice, by implementing some
convolutional networks, and applying them to the MNIST digit
classification problem. The program we'll use to do this is called
<tt>network3.py</tt>, and it's an improved version of the programs
<tt>network.py</tt> and <tt>network2.py</tt> developed in earlier
chapters*
-->
畳み込みニューラルネットワークの核となるアイデアをこれまで確認してきました。
実際にそれらがどう作用するのかを、畳込みネットワークを実装し、MNISTの数字分類問題へ適用することで確認してみましょう。
今回、私たちが使うプログラムは<tt>network3.py</tt>です。
これは以前の章で使った<tt>network.py</tt>と<tt>network2.py</tt>の改良版です*
<!--
<span class="marginnote">
*Note also that <tt>network3.py</tt> incorporates ideas
from the Theano library's documentation on convolutional neural nets
(notably the implementation of
<a href="http://deeplearning.net/tutorial/lenet.html">LeNet-5</a>), from
Misha Denil's
<a href="https://github.com/mdenil/dropout">implementation of dropout</a>,
and from <a href="http://colah.github.io">Chris Olah</a>.</span>.-->
<span class="marginnote">
*<tt>network3.py</tt>はTheanoライブラリの畳み込みニューラルネットワークのドキュメントからアイデアを取り込んでいることにも注意してください
(特に<a href="http://deeplearning.net/tutorial/lenet.html">LeNet-5</a>の実装部分) 。
また、Misha Denilの
<a href="https://github.com/mdenil/dropout">ドロップアウト</a>の実装や、
<a href="http://colah.github.io">Chris Olah</a>のアイデアも参照しています。</span>。
<!--If you wish to follow along, the code is available
<a href="https://github.com/mnielsen/neural-networks-and-deep-learning/blob/master/src/network3.py">on
GitHub</a>. Note that we'll work through the code for
<tt>network3.py</tt> itself in the next section. In this section, we'll
use <tt>network3.py</tt> as a library to build convolutional networks.
-->
コードを参照したい場合、<a href="https://github.com/mnielsen/neural-networks-and-deep-learning/blob/master/src/network3.py">GitHub</a>からコードを取得できます。
次のセクションでは<tt>network3.py</tt>を作り上げていきます。
一方、このセクションでは、<tt>network3.py</tt>を畳み込みネットワークを構築するためのライブラリとして使います。
</p><p>
</p><p>
<!--
The programs <tt>network.py</tt> and <tt>network2.py</tt> were implemented
using Python and the matrix library Numpy. Those programs worked from
first principles, and got right down into the details of