.NET開発者向けの人工知胜ずニュヌラルネットワヌク

珟圚、人工知胜は最も議論されおいるトピックの1぀であり、デゞタルビゞネス倉革の䞻芁な゚ンゞンです。 MicrosoftのAI戊略には、開発者向けのAIの民䞻化、぀たり 知的問題を解決するための䜿いやすいフレヌムワヌクずサヌビスを提䟛したす。 この蚘事では、.NET開発者がプロ​​ゞェクトでAIの機胜を䜿甚する方法に぀いお説明したす。クラりドで動䜜する既補の認知サヌビスから、.NET蚀語でのニュヌラルネットワヌクのトレヌニング、Raspberry Piなどのコンパクトなデバむスでの耇雑なニュヌラルネットワヌクの実行たで。


蚘事のプロトタむプは、 DotNext 2017モスクワ䌚議でのDmitry Soshnikovによるレポヌトでした。 Dmitryは、マむクロ゜フトのテクノロゞ゚バンゞェリストであり、初心者の開発者の間で最新の゜フトりェア開発テクノロゞを掚進しおいたす。 モノのむンタヌネットの分野、ナニバヌサルWindowsアプリケヌションの開発、関数型プログラミングの分野、および.NETプラットフォヌムF、Roslynを専門ずしおいたす。 圌は個人的にロシアで数十のハッカ゜ンを実斜し、倚くの孊生のスタヌトアップがさたざたな分野でプロゞェクトを開始するのを助けたした。 准教授、博士は、モスクワ物理孊技術研究所ずロシア人工知胜協䌚のメンバヌであるモスクワ航空研究所で、倏にUNIO-R子䟛キャンプのコンピュヌタヌ技術孊科の指導者ずしお授業を行っおいたす。


泚意トラフィック この投皿には、膚倧な数の写真がありたす。720p圢匏のビデオのスラむドずスクリヌンショットです。


この蚘事では、人工知胜に぀いお説明したす。 なぜ今圌に぀いお話すのが流行なのですか なぜなら、それは䞖界を非垞に急速に倉化させる䞀連のテクノロゞヌだからです。


䞖界の倉化の䟋は、マクドナルドです。 そしおアメリカでは、McAutoがありたす。 泚文を受け取る男性がそこに座っおいたす。 そしお、すでに玄20幎前にアメリカでは、そこに人は必芁ないず決められたした。圌をむンドに座っおいるオペレヌタヌず亀換する必芁がありたす-それはずっず安くなりたす。 圌は蚪問者ず電話で話し、それをすべおコンピュヌタヌに入れたす。泚文は準備され、アメリカ人に支払う必芁はありたせん。 窓に座っおいるアメリカ人は非垞に高䟡です。 この決定により、䟡栌を䞋げるこずができたした。ハンバヌガヌが安くなり、人々の健康が䜎䞋したした。すべおが順調です。 この方向の最埌の䞀歩は、そこに人はたったく必芁ないこずに気づいたずきに行われたした。 これを取埗しお、音声認識アルゎリズムに眮き換えるこずができたす。 このようなプロゞェクトは1幎以䞊前に、米囜マむクロ゜フトの同僚によっお䜜成されたした。


むンタヌネットには、マクドナルドの窓にいる人が聞いおいるこずを理解し、その人の苊しみの党䜓の深さを感じるこずができるビデオがありたす。 圌は䜕も聞こえたせん。隒音があり、車が通り過ぎおおり、圌はこれを認識せざるを埗たせん。 人間は疲れるので、AIは人間よりもうたく察凊できたす。



泚文を出す堎合、オペレヌタヌずの䌚話は非垞に具䜓的なトピックで行われ、誰もそのようなりィンドりで人生の意味に぀いお話すこずはありたせん。 メニュヌが明確なずき、蚀葉が明確なずき、コンピュヌタは人よりもよく認識したす。 2016幎、Microsoftは、人間よりも優れた音声認識アルゎリズムを最終的に䜜成したずいう声明を発衚したした。 テストされ、本圓に優れおいるこずが確認されたした。


2015幎、コンピュヌタヌは特定の画像亀通暙識を認識し始めたした。 埓来、1000枚の写真の䞭から、コンピュヌタは人よりも道路暙識を芋぀けやすくなっおいたす。 なんで おそらく、これは䞭倮のどこかで人を悩たせたすが、コンピュヌタでは悩みたせん。 しかし、結果は結果です。コンピュヌタヌは私たちよりもそのようなタスクにうたく察凊したす。


AIでのMicrosoftの業瞟のリストは次のずおりです;それらは印象的です。



マむクロ゜フトは他の先を行っおいたす。 クラりドでプログラムされたFPGAチップを䜿甚しおニュヌラルネットワヌクを実行する方法に関する研究が進行䞭です。 ここでの゜リュヌションの範囲は広範です。


䌚瀟の党䜓的な戊略は䜕ですか AIの分野でマむクロ゜フトは䜕をしおいたすか


たず、圓然、補品に導入したす。 Power BI、HoloLens-認識が今ではめちゃくちゃになっおいたす。 たた、PowerPointには、AIが䜿甚される倚くの堎所がありたす。 たずえば、「スラむドをデザむンしおください」ずいうボタンがあり、「デザむンのアむデア」ず呌ばれ、シンプルなスラむドのデザむンを提䟛したす。 これは、機械孊習ずAIテクノロゞヌの適甚の結果です。 たたは、PowerPointに画像を挿入するず、自然蚀語の眲名が生成されたす-それに描かれおいるもの。 次に、Webのどこかに゚クスポヌトするず、察応するタグが正しく付加されたす。 些现なこずのように思えたすが、玠晎らしいこずです。


AIは補品に導入され、クラりドでより効率的に䜿甚する方法に぀いお研究が行われおいたす。そしお、最も重芁なのは開発者にずっお、AIは䜿いやすくするために民䞻化されおいたす。



認知サヌビスがありたす。 これらは、画像凊理など、察凊する必芁がある基本的なタスクに単玔に䜿甚できたす。 たずえば、補品に機胜を導入しお、画像にキャプションが自動的に挿入されるようにしたす。 これは難しくありたせん-既補のクラりドサヌビスがありたす。写真を提䟛するず、圌は英語で説明を返したす。 機械翻蚳を補品に導入する堎合、すべおが非垞に簡単です。BingTranslatorサヌビスを䜿甚するず、ほがすべおの蚀語からあらゆる蚀語ぞの翻蚳が提䟛されたす。 これらの機胜は誰でも利甚できたす。


民䞻化には、認知サヌビス、ボット、機械孊習-Azure ML、ニュヌラルネットワヌク-Microsoft Cognitive Toolkitの4぀の䞻芁な領域がありたす。 最埌の2぀に぀いお説明したしょう。



機械孊習の䞻なアむデアは、コンピュヌタヌがデヌタに察しお䜕かを行う方法を孊習するこずです。


たずえば、写真から人間の感情を認識する方法を孊びたいです。 これをどのように行うこずができたすか



アルゎリズムの曞き方を考えるず、すぐに行き止たりになるこずは明らかです。 たずえば、驚きず恐怖を正確に区別する方法はわかりたせん。どちらの堎合も目は䞞いです。 これをアルゎリズム的に行う方法は明確ではありたせん。 そしお、倚くの写真を撮るなら、おそらく、どういうわけか自動的にそれを行うこずができたす。 どうやっお たず、写真からいく぀かの基本的な兆候を特定するこずが重芁です。䜕らかの数倀むンゞケヌタに切り替えるこずが重芁です。 なぜなら写真は倚くの詳现を䌎う抜象的なものだからです。 しかし、たずえば、目の䜍眮、唇の角の䜍眮を認識し、衚で衚すこずができる数倀的なものに進むこずができたす。 さらに、これは入力ずしお機械孊習に適甚できるため、アルゎリズムはそれらのパタヌンを芋぀け、予枬を行うこずができるモデルを構築したす。 次に、顔を取り、その䞭の同じ蚘号を匷調衚瀺しお、モデルの入力に送信したす。モデルは、たずえば、これは80が幞せ、20が䜕か他の人であるず䌝えたす。



甚語に぀いお話す堎合、人工知胜は人間のタスクに察凊する䜕かをする䞀般的なトピックです。 機械孊習はAIの䞀郚です。アルゎリズムが私たちによっお曞かれおいない堎合、デヌタ凊理に基づいお曞かれおいたす。 ニュヌラルネットワヌクは、機械孊習の1぀の特定のケヌスです。 たた、ニュヌラルネットワヌクの内郚では、ファッショナブルな甚語である「ディヌプラヌニング」も、ニュヌラルネットワヌクが深い堎合に区別されたす。 䞀般に、倚くの耇雑なタスクはこの非垞に「深い孊習」の助けを借りお正確に解決されるため、ニュヌラルネットワヌクは残りのアルゎリズムを混雑させおいたす。



ツヌルに関しおディヌプラヌニングを行う人々はどのように生きたすか PythonずRの2぀の蚀語がありたす。Pythonがデヌタサむ゚ンティストに人気を博したのはなぜですか もちろん、C ++で曞かれた非垞に優れたラむブラリが倚数ありたすがそうでなければ遅いので、Pythonには非垞に優れたラッパヌがありたす。 したがっお、Pythonをさたざたなラむブラリの接着剀ずしお䜿甚するず䟿利であるこずがわかりたした。 たた、機械孊習甚のラむブラリがすでに倚数あるため、それらを遞択しお䜿甚を開始できるようになりたした。


ニュヌラルネットワヌクでも同じです。 誰もがラむブラリを実装し始めたずき、「すべおのデヌタサむ゚ンティストがPythonで蚘述しおいるため、すべおのラむブラリをPythonで䜜成する必芁もありたす。」ず考えたした。 そのため、Pythonをサポヌトするラむブラリが倚数ありたした。 MicrosoftでさえCNTKラむブラリのPythonサポヌトを䜜成したしたが、.NETは長い間サポヌトしたせんでした。


R蚀語では、さらに興味深いこずがありたす。Rには、既成の包括的なRアヌカむブネットワヌクがあり、あらゆる堎面で既補のラむブラリがたくさんありたす。 この蚀語ず他の10䞇のラむブラリを孊ぶ必芁がありたす。


そしお、これに遭遇したこずがない人はどうですか



䞀方では、勉匷に行くこずができたすが、したくありたせん。 私はニュヌラルネットワヌクを䜿甚する必芁があるため、Pythonを䜿甚する堎合、それほど嫌悪感を感じるこずはありたせんが、これを行うのは困難です。 型付けされた矎しい.NET蚀語の埌、すべおを開始したずきに゚ラヌがチェックされず明確にされる型付けされおいない蚀語に切り替えるこずは、心理的に非垞に困難です。 手のないプログラミングのような感芚。


ニュヌラルネットワヌクの機械孊習ずトレヌニングの問題を解決するために、.NETの䞖界にどんなツヌルがあるのか​​芋おみたしょう。



「䞀般的に、自分で䜕かを曞くのは難しいですか」ずいう質問から始めたしょう。 簡単な堎合はどうなりたすか」



そしお、そのような叀兞的なタスクを取りたしょう手曞き数字認識。 米囜統蚈局の䞀郚の埓業員が曞いた50,000〜70000の手曞き数字のどこかに既補のデヌタセットがありたす。 このデヌタは公開されおおり、28 x 28ピクセルの画像ずしお衚瀺されたす。 この䜜業はそれほど難しくないように思えたすが、䞀方で、あたりにも単玔ではなく、䞀郚のおもちゃはたったくなく、モスクワのアパヌトの䟡栌を予枬しおいたせん。 圌女にアプロヌチする方法はあたり明確ではありたせん。 この問題をどのように解決し、どのように効率的か぀適切に解決できるかを芋おみたしょう。


頭に浮かぶ最も簡単な解決策は䜕ですか 50,000の䟋があり、誰かが数字を曞いお「この数字は䜕ですか」ず蚀いたす。 50,000個すべおず単玔に比范しお、最も適切なものを遞択できたす。 比范する方法は ピクセル単䜍の明るさの違いを考慮するこずができたす。



このようなアルゎリズムは、Kが1である「K最近傍」ず呌ばれたす。プログラミングが困難かどうかを芋おみたしょう。



同時に、すべおのデヌタサむ゚ンティストが䜿甚する優れたツヌルであるJupyter Notebookを玹介したす。 これは、Web䞊のプログラムテキストずmarqdownで蚘述されたテキストを組み合わせるこずができる非垞に䟿利なツヌルです。 こんな感じです。



テキストセルがあり、実行できるコヌドセルがありたす。 Jupyter NotebookはPythonの䞖界のツヌルであるため、PythonずRを十分にサポヌトしたすが、C、F、Prologなどの他の蚀語のサポヌトも远加できたす。 同時に、マむクロ゜フトは次のように述べおいたす。「これらのJupyterノヌトブックをクラりドで䜿甚できるようにしたす。」 これを自分でむンストヌルする堎合は、コンピュヌタヌにPython、Jupyterをむンストヌルし、すべお実行しおからブラりザヌで開く必芁がありたす。 たた、Microsoftは既補のノヌトブックをクラりドで提䟛しおいたす。notebooks.azure.comにアクセスしお䜜業を開始できたす。Microsoftアカりントでログむンし、コヌドを䜿甚しおこれらのノヌトブックを䜜成できたす。 このコヌドはクラりドで無料で実行されたすが、特定の制限がありたす。 たずえば、クラりドたたはGitHubからの特定の堎所からのみデヌタを取埗できたす。 これらのMicrosoftノヌトブックは、Python、R、およびFをサポヌトしおいたす。 C-いいえ、Fサポヌト。 なんで Fの方が良いからですか


実際、Fにはすおきな既補の優れたサポヌトが既にあるためです。 Cには、Xamarin Workbookず呌ばれる同様のツヌルがありたす。 これは倚少䌌おおり、コンピュヌタヌ䞊でロヌカルに機胜したすが、コヌドずテキストを組み合わせるこずができたす。 コヌドをテキストず組み合わせるず、すべおが䞀床に明確になり、すべおの手順が説明されるため、非垞に䟿利です。


これらの数倀の画像は、CSVコンマ区切り倀の圢匏で衚瀺されたす。 さらに、各行の最初の芁玠は曞き蟌たれた数字そのものであり、残りは784個の数字の配列であり、それぞれが察応するピクセルの明るさです。 そしお、この数字の行列は、数字の長い列に配眮されおいたす。 Fで、これらの倀をむンタヌネットから取埗し、そのような長い行を読み取っお返す関数を説明したした。



さお、これで䜕かをするために、それを配列に入れお2぀の郚分に分けたす train_sampleこれはトレヌニングサンプル、 test_sampleこれは怜蚌甚です。 通垞、50,000のトレヌニングず数千のテストを実斜したす。 そしお、それらを䟿利な圢にしたす。ペアで提瀺したす。 ペアでは、数字ず残りのピクセルの配列がありたす。 そしお、そのようなカップルがたくさんありたす。


次に、どのようにしお最も近いものを芋぀けるのでしょうか 最も近いものを芋぀けるために、距離を決定する必芁がありたす。 距離を決定するために、距離関数を説明したす。この関数は、むメヌゞを含む2぀の配列を受け取り、これらの配列を反埩凊理し、平方の差ず合蚈を考慮したす。 ぀たり、これはデカルト距離であり、単にルヌトを抜出したせん。 近接性を瀺したす。配列が同じ堎合はれロを瀺し、少し異なる堎合はいく぀かの数がありたす。 そしお、察応する数字を芋぀けるために、すべおのtrain_data - train_dataを取埗し、それらのどれが最小距離であるかを探し、察応する数字を取埗したす。 コヌドは簡単です。 さらに開始するず、すべおが機胜したす。



テストデヌタを取埗したす。 この堎合、䞊䜍3぀の゚ントリを取埗しお認識しようずしたす。8は8、7は7、2は2ずしお認識されたす。これは良いこずで、垌望を呌び起こしたす。 テストサンプル党䜓をさらに調べるず、94の正しい認識が埗られたす。 これは、原則ずしお非垞に優れおいたす。


94-ほんの数行しか曞いおいたせんが、これ以䞊ほずんど䜕もできたせん。



そしお、Cで同じこずをしたい堎合は


誰かが知らない堎合は衚瀺したす。 Visual Studioには、CInteractiveずいう優れたツヌルがありたす。 これは、次のようにCを盎接実行できるコン゜ヌルです。テキストを遞択し、キヌを抌すず、コン゜ヌルで実行されたす。 Cで同じこずをしたい堎合、どのようになりたすか


 #r "SciSharp.dll" using SciSharp; using static System.Console; class Digit { public int[] Image; public int Label; } var fn = @"train.csv"; var f = File.ReadLines(fn); var data = from z in f.Skip(1) let zz = z.Split(',').Select(int.Parse) select new Digit { Label = zz.First(), Image = zz.Skip(1).toArray(); }; var train = data.Take(10000).toArray(); var test = data.Skip(10000).Take(1000).toArray(); Func<int[ ],int[ ],int> dist = (a, b) => a.Zip(b, (x, y) => { return (x - y); } ).Sum(); Func<int[ ], int> classify = (im) => train.MindBy(d => dist(d.Image, im)).Label; int count = 0, correct = 0; foreach (var z in test) { var n = classify(z.Image); WriteLine("{0} => {1}", z.Label, n); if (z.Label == n) correct++; count++; } 

以䞊です。 その埌、実行しお結果を楜しむこずができたす。 数字はゆっくりず認識されたす。これは、数字ごずに50,000レコヌドこの堎合は50,000レコヌドではなく、10,000レコヌドを調べる必芁があるためです。 したがっお、実際の䜿甚では、このようなアルゎリズムはあたり適しおいたせん。 すぐに曞きたしたが、それほど悪くはありたせんが、非垞に遅いです。 䞀般に、機械孊習が高速で動䜜するモデルを構築し、プロセスの本質をカプセル化するのは玠晎らしいこずです。すべおの゜ヌスデヌタず比范するたびにではありたせんが、ある皋床の芏則性がありたす。 したがっお、もちろん、他のアルゎリズムを䜿甚するこずをお勧めしたす。



したがっお、スムヌズに次の゚ピ゜ヌドに進みたす。



自分でプログラムを䜜成しないようにするには、既補のラむブラリがあるかどうかを確認する必芁がありたす。 ここで、.NETにはAccord.NETず呌ばれる優れたラむブラリがあるこずがわかりたした。



機械孊習を行うには、マトリックス、統蚈、およびさたざたな統蚈関数を適切に凊理できる必芁がありたす。 たた、Accord.NETには関連する芁玠が含たれおいたす。 統蚈を担圓するフラグメントがあり、遺䌝的アルゎリズム、ニュヌラルネットワヌク、音の凊理、画像を担圓するアルゎリズムがありたす。 グラフを䜜成できる䟿利な機胜もありたす。 デヌタサむ゚ンティストは、倚くの堎合、デヌタが盞互にどのように䟝存しおいるかを確認する必芁がありたす。


このために、すでにプログラムを䜜成したす。WriteLineが曞き蟌たれおいるような空癜がありたす。 これは、すでに存圚しおいるのず同じコヌドです。 圌はすべおのデヌタを私に読み、テストずトレヌニングのサンプルに分割したす。 そしお、Accord.NETを䜿甚しお、これらの数字を画面に描画したす。 このような矎しい関数がありたす-ImageBox.Showを䜿甚するず、䜕かを描画できたす。


 #r "SciSharp.dll" using SciSharp; using static System.Console; class Digit { public int[] Image; public int Label; } var fn = @"train.csv"; var f = File.ReadLines(fn); var data = from z in f.Skip(1) let zz = z.Split(',').Select(int.Parse) select new Digit { Label = zz.First(), Image = zz.Skip(1).toArray(); }; var train = data.Take(10000).toArray(); var test = data.Skip(10000).Take(1000).toArray(); for (int i = 0; i < 5; i++) { ImageBox.show(train[i].Image.Select(x => x / 256.0).toArray(), 28, 28); } 

次に、䜕らかの孊習アルゎリズムをそれらに適甚したす。 たず、同じKNearestNeighbors分類子。 アコヌドではどのように芋えたすか


 var classifier = new KNearestNeighbors(1); classifer.Learn( (from x in train select x.Image.Select(z=>(double)z).toArray()).toArray(), (from x in train select x.Label).toArray()); 

「Kが1のKNearestNeighbors分類噚を䜜成したい」ず単玔に蚀いたす。 ずころで、KNNアルゎリズムでは、このKはどういう意味ですか 䞀般的な堎合、最も近い番号を取埗するだけでなく、たずえば、最も近い5぀の番号を取埗し、その䞭で最も頻繁に発生する番号を探しおいたす。 4は3倍、2倍は1のようになりたす。そしお、4を取りたす。このクラスを増やすず、認識が少し良くなりたすが、効率が倧幅に䜎䞋したす。 したがっお、1を取り、「Classifier.Learn。 孊んでください。」 そしお、圌にデヌタを枡したす。 この堎合、画像マトリックスず察応する数字のマトリックスを別々に送信する必芁があるため、デヌタをカットする必芁がありたした。 このアコヌドは、2぀の配列が枡されるように配眮されおいたす。


次に、それがどのように機胜するかを芋るこずができたす。


 foreach (var z in test) { var n = classifer.Decide(z.Image.Select(t=>(double)t)).toArray()); WriteLine("{0} => {1}", z.Label, n); if (z.Label == n) correct++; count++; } 

これは以前芋たものより少し速く動䜜するようですが、それほど倚くはありたせん。 5,000桁埅぀ず、十分に長くなりたす。 ただし、同じアルゎリズムを䜿甚したため、認識の粟床はたったく倉化したせん。 しかし、私たちは手動でそれを曞いたのではなく、完成した実装を取りたした。


なぜこのアプロヌチは良いのですか これで、代わりに他の分類子を䜿甚できたす。 たずえば、この分類子を削陀し、いわゆる分類子サポヌトベクタヌマシンを䜿甚したす。 これは、異なるクラスのアルゎリズムです。


 var svm = new MuliclassSupportVectorLearning<Linear>(); var classifier = svm.Lean( (from x in train select x.Image.Select(z=>(double)z).toArray()).toArray(), (from x in train select x.Label).toArray()); 

圌らはどのように配眮されおいたすか 機械孊習の芳点では、このタスクは分類問題ず呌ばれ、オブゞェクトがあり、10のクラスのいずれかに割り圓おる必芁がありたす。 そしお、ここではサポヌトベクタヌマシンがこれらのクラスを取りたす。 それらが状態空間で䜕らかのグラフィック圢匏で提瀺される堎合、それはテキスト、いく぀かの倚次元ポむントの雲になりたす。 784の次元を持぀空間内のポむントを想像しおください。各ポむントはそれぞれの数字に察応しおいたす。 圌らは䜕ずか分離する必芁がありたす。 サポヌトベクタヌマシンアルゎリズムのアむデアは、これらのクラスの芁玠から可胜な限り離れた平面を構築するこずです。 しかし、省略されたものの垂線に関しお分割するのが最善です。 ぀たり、分類タスクは、最適に分離される平面を構築するタスクです。 この平面に最も近い点から垂線を芋お、この距離を最小化するず、サポヌトベクタヌマシンは察応する平面を描画したす。


2行だけを眮き換えたした。 実際、アルゎリズムの名前は倉曎されおいたす。


実行するず、アルゎリズムはしばらく孊習したす。 ここでの状況は、ある意味では、私たちが芋たものの反察です。 前のアルゎリズムがトレヌニングされおいなかったが、すぐに番号を分類する準備ができおいたが、分類プロセスで䜜業自䜓が行われたために非垞に長い間行った堎合、このアルゎリズムが最初にトレヌニングされたす。 圌はこれらの超平面の係数を遞択したす。 そしお、圌がそれをしおいる間、䞀定の時間が経過したす。 しかし、圌はすぐに認識し始めたす。 非垞に高速なので、これらの非垞に1000たたは5000のテストデヌタがすべお蚈算される方法を数秒で確認できたす。 そしお、粟床は玄91.8で、やや䜎いこずがわかりたす。



アコヌドのメリットは䜕ですか さたざたなアルゎリズムがあり、詊しおみるのは非垞に簡単です。コンストラクタヌを眮き換えるだけで、あるアルゎリズムを別のアルゎリズムに眮き換えるこずができ、その動䜜原理は非垞に䌌おいたす。 機械孊習の課題に盎面しおいる堎合、これは始めるための良い第2ステップです。 最初のステップは、MicrosoftクラりドでのAzure Machine Learningです。プログラミングは䞀切必芁ありたせん。 そこで、デヌタを芖芚的に簡単に詊すこずができたす。 そしお、.NETを知っおいる人のための2番目のステップはAccord.NETです。



SciPyやScikit-learnのようなあらゆる皮類のラむブラリがPythonで䜿甚される分野では、.NETの䞖界の類䌌物はAccord.NETであるこずを理解しおいたす。


ニュヌラルネットワヌクに移りたしょう。



ニュヌラルネットワヌクずは䜕かに぀いお少し話したしょう。 あなたがそれらに぀いお知る必芁がある最も重芁なこずは、近幎、倚くの人がニュヌラルネットワヌクをAI䞀般の同矩語ず芋なしおいるこずです。 人が「人工知胜」ず蚀うず、すぐに頭の䞭にニュヌラルネットワヌクが珟れたす。 Microsoftのすべおの認知サヌビスはニュヌラルネットワヌクに基づいおおり、魔法のように芋えたす。 想像しおみおください。あなたが圌女に写真を枡すず、圌女は英語で䜕が描かれおいるかを説明したす。 これをどのように行うこずができたすか 私の意芋では、これは奇跡です。



しかし、同時に、数孊的な芳点から、この奇跡は、非垞に倚次元空間内の特定の点矀を最適に近䌌する関数を構築する方法にすぎないこずを理解しおいたす。 ぀たり、そのような奇劙な状況が刀明したす。䞀方で、数孊の芳点からは、奇劙なこずは䜕も起こりたせん。 すべおが非垞に明確に思えたす。 そしお他方では、䜕らかの理由でこれはそのような興味深い問題を解決したす。


私は最近、倜もひどく眠り始めたした。「そしお、私の脳もそうですか たぶん圌は関数を近䌌しおいるだけかもしれたせんか」


すべおが魔法のように芋えたす。 画像をテキストに倉換するなどの深刻なタスクには、非垞に倧きなコンピュヌティングリ゜ヌスが必芁であるこずを理解するこずが非垞に重芁です。 これはおそらくクラりドたたは匷力なビデオカヌドのいずれかですが、暗号通貚はすでにすべおを賌入しおいるため、すでに利甚できなくなっおいたす。 そしお、これも悲しいです。 しかし、車はクラりドに残りたした。



ニュヌラルネットワヌクはどのように配眮されおいたすか ニュヌラルネットワヌクは、ある意味で、建築における人間の脳に䌌おいたす。 人間の脳には、互いに接続されたニュヌロンがあり、孊習プロセスにおけるこれらの接続は、䌝導率、重みを倉化させたす。 したがっお、゜フトりェアの芳点から、特定の数の入力があり、それぞれが䜕らかの皮類の数倀を持぀可胜性がある蚭蚈を取埗したす。 次に、いく぀かの䞭間局がありたす。たずえば、入力からこの前の局から信号を取埗し、特定の重み係数で芁玄したす。 ここで特定の数倀を取埗し、次の入力レむダヌから集蚈するず、結果ずしお䜕らかの出力が埗られたす。


たずえば、猫や犬の写真の認識問題の堎合。 ゚ントランスに䜕を提出したすか 入り口で写真を提出したす。 各入力は写真の別々のピクセルになり、猫たたは犬の2぀の出力がありたす。 そしお、䞭倮に䞀定数のレむダヌがありたす。


そしお、䜕をする必芁がありたすか このニュヌラルネットワヌクが゚ントリの正しい出口を提䟛するように重みを調敎したす。 最初に画像を指定した堎合、出力に乱数が衚瀺されるこずは明らかです。 そこに係数がランダムだった堎合、それはいく぀かの数を䞎えたす。 そしお、「いいえ、猫のように芋えるように重みを調敎したしょう」ず蚀いたす。 このために、いく぀かのアルゎリズムを䜿甚したす。


゚ラヌの逆䌝播のためのアルゎリズムがあり、重みを調敎できたす。 次に、次の䟋を瀺したす-重みを再床調敎したす。 そのため、非垞に倚くの䟋に察しお䜕床も䜕床も行いたす。 数孊の芳点から、ここでは非垞に単玔なこずが起こりたす。 この局のこの出力局がベクトルであるず想像した堎合、実際には、この入力ベクトルxに䜕らかの行列を乗算し、他のシフトを远加しお、これに非線圢関数を適甚したす。 実際、各レむダヌに察しお、ベクトルによるマトリックス乗算を行いたす。 すべおが非垞に簡単です。


しかし、なぜ非線圢関数を䜿甚するのでしょうか 特定の範囲の数倀を取埗するこずもありたす。 しかし、非垞にキラヌな議論がありたす。 そうでない堎合、すべお行列の積のように芋え、行列の積は任意の1぀の行列に盞圓したす。 入力ベクトルを取埗する堎合、1぀の行列を乗算し、次に別の行列を乗算したす。2぀の行列を単玔に乗算し、この行列の積で数倀を指定したす。 したがっお、非線圢関数を远加しおいなければ、レむダヌの数は圱響を受けず、すべおが1぀のレむダヌのようになりたす。 そしお、非線圢性の远加により、それは連続した拡匵のようになりたす。 そしお、これが玚数展開の堎合、任意の関数を近䌌できたす。 これが圓おはたらない堎合は、凞線圢倚様䜓のみを近䌌できたす。 したがっお、非線圢関数を远加するこずが非垞に重芁です。 さらに、非線圢関数も異なりたす。


以前は、「シグモむド」ず呌ばれるこのような矎しい非線圢関数を䜜成するこずが慣習でしたが、珟圚では線圢関数の圢で非線圢関数を䜜成するこずが流行になっおきおいたす。 それは半分線圢ですそれは0より倧きい線圢であり、0より小さい線圢は0です。なぜですか 実装に効果的だからです。 その掟生物は簡単であるず考えられたすが、それは悪い掟生物です。 ただし、このような機胜はよく䜿甚されたす。



ニュヌラルネットワヌクを実装するにはどうすればよいですか 手動でプログラムするこずもできたすが、このタスクはそれほど難しくはありたせんが、あたり快適ではありたせん。 さらに重芁なのは、GPUでこれをすべお蚓緎したいので、うたくやれば、鉄の行列のグラフィック乗算を孊習する必芁がありたす-これはすべお難しくなりたす。


したがっお、通垞、既成のフレヌムワヌクを䜿甚したす。 GoogleのTensorFlowがありたす。これは䞻芁な競合であり、誰もが䞻に䜿甚しおいたす。 他にもいく぀かありたす。



アコヌドにはニュヌラルネットワヌクもありたす。このアルゎリズムを䜿甚しお倉曎するだけで、ここでニュヌラルネットワヌクを取埗できたす。 すべおが少し異なりたす。


 var nn = new ActivationNetwork(new SigmoidFunction(0.1), 784, 10); var learn = new BackPropagationLearning(nn); nn.Randomize(); WriteLine("StartingLearning"); for (int ep=0; ep<50, ep++) { var err = learn.RunEpoch((from x in train select x.Image.Select(t=>(double)t/256.0).toArray(), (from x in train select x.Label.ToOneHot10(10).ToDoubleArray()).toArray() ) WriteLine($"Epoch={ep}, Error={err}"); } int count=0, correct=0; foreach (var v in test) { var n = nn.Compute(v.Image.Select(t=>(double)t/256.0).toArray()); var z = n.MaxIndex(); WriteLine("{0} => {1}"), z, v.Label); if (z == v.Label) correct++; count++; } WriteLine("Done, {0} of {1} correct ({2}%)", correct, count, (double)count * 100); 

ニュヌラルネットワヌクにはこのような問題がありたす。それを行うず、さたざたなトレヌニングパラメヌタヌがあるため、垞にうたく機胜するずは限りたせん。 この堎合、これはたさにこのアクティベヌション関数の幅です。 0から1にしたのはあたり良くありたせん。-1から1にしたほうが負のゟヌンにある方が良いでしょう。 たずえば、関数が線圢ではなく、半線圢である堎合、負のゟヌンにあるこずが重芁です。 埮劙な違いがありたす。 そしお、最初の詊みは垞に成功するずは限りたせん。


トレヌニングの各段階で、残っおいる間違いを印刷したす。 出口を必芁なものに近づけたすが、同時に䜕らかの間違いが䟝然ずしお存圚し、孊習プロセスは垞に枛少したす。 しかし、時々それは増加し始めたす-これはおそらく、䜕かが間違っおいたずいう確かな兆候であり、すでにトレヌニングを停止する䟡倀がありたす。 たた、再トレヌニングの問題もありたす。ネットワヌクが再トレヌニングされるず、予枬が悪化し始めたす。


たずえば、䞊蚘のコヌドのテストを実行するず、88.3が埗られたす。 これはあたり良くありたせんが、それほど悪くはありたせん。


しかし、ニュヌラルネットワヌクは以前よりもはるかに優れおいるこずがわかりたす。


しかし、ニュヌラルネットワヌクはAccordで教えるこずができたすが、必芁ではありたせん。より優れた専甚のフレヌムワヌクがあるためです。


Microsoft Cognitive Toolkit、なぜそれが矎しいのですか GPU、GPUコンピュヌタヌのクラスタヌで䜿甚できたす-あらゆるケヌスで。 さらに、オヌプン゜ヌスであり、迅速か぀積極的に開発されおいたす。 たずえば、9月たで、.NETでのニュヌラルネットワヌクのトレヌニングは蚱可されおいたせんでしたが、珟圚は蚱可されおいたす。



最初は、2぀のトレヌニングモヌドがありたした。ネットワヌクアヌキテクチャをBrainScriptず呌ばれる特別な蚀語で蚘述し、゜ヌスデヌタずこのスクリプトをコマンドラむンでナヌティリティに送り、「ニュヌラルネットワヌクを教えおください」ず蚀うこずができたした。 これはすべおコマンドラむンで行われ、モデルファむルが曞き蟌たれたした。これは、C、Pythonなどのプロゞェクトから取埗しお䜿甚できたす。


しかし、その埌、たるでファッションの指瀺に埓うかのように、圌らは孊習プロセスをPythonに移したした。 実際、これはそれほど悪くはありたせん。すべおがより柔軟になり、ネットワヌクの異なる芞術的なアヌキテクチャを䜜成でき、新しい蚀語のBrainScriptを孊ぶ必芁がないからです。 しかし、2017幎9月たでは、CNTKを䜿甚する䞻なモヌドは次のずおりでした。Pythonで教えたすが、.NETで䜿甚できたす。


しかし、䜕らかのプロゞェクトを行っお結果を顧客に芋せたいずきは垞に、ニュヌラルネットワヌクをボットでラップしたす。 次に、写真を撮圱するず、ネットワヌクが結果を生成したす。 ボットはCで蚘述されおおり、ニュヌラルネットワヌク蚈算を簡単に統合でき、トレヌニングは垞にPythonずクラりド内の仮想マシンで行われおいたす。



クラりドを詊しおみたい堎合は、クラりドにData Science Virtual Machineず呌ばれる既補のマシンがありたす。 䜜成するず、䞻にPythonで必芁な゜フトりェアがすべおむンストヌルされおいるマシンがわかりたす。



少し繰り返したす。以前、トレヌニングのメむンモヌドはこれでした。BrainScriptたたはPythonを䜿甚しおニュヌラルネットワヌクをトレヌニングし、ファむルを取埗しおから.NETから䜿甚したす。 そしお、これはすべおC ++ラむブラリの䞊で動䜜したす。 それず、別の䞡方トレヌニングず蚈算の䞡方。


9月に、トレヌニングをサポヌトするために特別なAPIが远加されたした。 なぜこれが可胜ですか 競合他瀟がただないのはなぜですか



CNTKの仕組みを芋るず、このようなラむブラリには䜕が含たれおいたすかテン゜ルず呌ばれるこれらの行列を扱うには、特定の䜎レベルがありたす。これは、非垞に倚次元の行列を扱うこずが倚いためです。配列は3次元、4次元、倚次元なので、テン゜ルもそうです。しかし、異なるスラむスを取るためにテン゜ルだけを乗算する必芁がある堎合が倚いため、これを行うこずができる特別なラむブラリが必芁です。


CNTK , - . , : . , , , , , . - . , : , -, , , - . , transformations, - .


CNTK. — , . , , , . , , , , , . .


CNTK API , . , , : « - , -, - ». Layers API.


CNTK, C++, API Python .NET.


? TensorFlow. TensorFlow C++, , , . Python. , , , . TensorFlow .NET. , TensorFlow C#, .


Keras. TensorFlow, , , Keras , CNTK Layer API. .


Keras , CNTK . Keras, CNTK TensorFlow, - .



, CNTK .


, . ? , float, 256 — , 0 1.


 #r "SciSharp.dll" using SciSharp; using static System.Console; class Digit { public float[] Image; public int Label; } var fn = @"train.csv"; var f = File.ReadLines(fn); var data = from z in f.Skip(1) let zz = z.Split(',').Select(int.Parse) select new Digit { Label = zz.First(), Image = zz.Skip(1).Select(x=>x/256f).toArray(); }; var train = data.Take(10000).toArray(); var test = data.Skip(10000).Take(1000).toArray(); 

, CNTK? .


 DeviceDescriptor device = DeviceDescriptor.CPUDevice; int inputDim = 784; int outputDim = 10; var inputShape = new NDShape(1, inputDim); var outputShape = new NDShape(1, outputDim); 

-, , CPU. , 784 — 28 28, — 10, 10 . Shape. Shape — . NDShape . .


 Variable features = Variable.InputVariable(inputShape, DataType.Float); Variable label = Variable.InputVariable(outputShape, DataType.Float); var W = new Parameter(new int[] { outputDim, inputDim }, DataType.Float, 1, device, "w"} ); var b = new Parameter(new int[] { outputDim }, DataType.Float, 1, device, "b"} ) var z = CNTKLib.Times(W, features) + b; 

? . ? , , . , Variables, . variable, features — , 768, , lable, 10. . . , , , , .


, — W — 10 768. 10, outputDim. . , , — Z, W + b. . それだけです


: « , - , , ».


 var loss = CNTLib.CrossEntropyWithSoftmax(z, label); var evalError = CNTKLib.ClassificationError(z, label); 

, CrossEntropyWithSoftmax, , . .


, . ). Learner, Trainer. Trainer , Learner, 60 : «Trainer.Train».


.



: ? , , , , . Python? 同じように。 Python - , . Python, C# — .



. ? . ? 1500, - . , . , . 94% .



. , , , ? — ? , .



, « ». ? , . , , . , , . . , , , , . . , , . , 98%.



- .



, . Convolution. 28 28 1 — 28 28 — 14 14 4. 4 , - , , , . , 14 14 4 7 7 8. .



- . , 5 . : « , , , ?» : « , 20 , ». , . , : « ! - !» , , .


, , , , . , , . , , , , 500-1500 , . , , , , , — . , , . , .



C#, , ( Python), — 6 . 3 , 5 5 — 32 32 . . 3 3 .


Python , , 50, 75. , , , . 0,8 , 0,4 , 0,65 . , 3-4 , .


?


:



F# API CNTK:



, , . , . — , . 4, -, 6. , Notebook' Python , . . , Coursera - .


— , , - . CNTK, , , F#. C# , F#. . , . GitHub , . , , , — 2017 C#, , , .



, , . ? .NET , . , Azure Notebooks, C# Interactive, Xamarin Workbooks — , , . , Microsoft — CNTK, C#, , . , 10-15 , .


広告の分。 おそらくご存知のように、䌚議を行っおいたす。 .NET — DotNext 2018 Piter . 22-23 2018 -. — YouTube . .NET . 芁するに、私たちはあなたを埅っおいたす。


Source: https://habr.com/ru/post/J352138/


All Articles