派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

【イベントレポート】プログラミング初心者の最初の壁、環境構築について学ぼう

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを定期的に開催しています。

2018年12月14日のイベントでは「プログラミングを学び始めるときの環境構築〜エンジニアが生き残るためのテクノロジーの授業」を開催。

プログラミングを始めるとき、最初につまずくのは環境構築。今回は増井さんに、手軽に試せる開発環境から、主流な環境の準備、便利な開発ツールなどを、主にPHPとJavaScriptでのWeb開発を目指す方向けにお話いただきました。レポートでは、PHPの環境構築について詳しく解説します。

■今回のイベントのポイント
・プログラミングを始めるときの悩み
・オンライン実行環境を試す
・PHPの環境を構築する
 
【講師】増井 敏克さん
【講師】増井 敏克さん
増井技術士事務所代表。技術士(情報工学部門)。情報処理技術者試験にも多数合格。ビジネス数学検定1級。「ビジネス」×「数学」×「IT」を組み合わせ、コンピュータを「正しく」「効率よく」使うためのスキルアップ支援や、各種ソフトウェアの開発、データ分析などを行う。著書に『おうちで学べるセキュリティのきほん』『プログラマ脳を鍛える数学パズル』『エンジニアが生き残るためのテクノロジーの授業』『もっとプログラマ脳を鍛える数学パズル』『図解まるわかりセキュリティのしくみ』(以上、翔泳社)、『シゴトに役立つデータ分析・統計のトリセツ』『プログラミング言語図鑑』『プログラマのためのディープラーニングのしくみがわかる数学入門』(以上、ソシム)がある。

プログラミングを始めるときの悩み

プログラミングを学び始めるとき、どのプログラミング言語から学べばいいか迷うことがあります。世の中には非常に多くのプログラミング言語があり、作りたいシステムの規模や目的、実行する環境などによって最適な言語は変わってきます。

学生であれば、学校で指定された言語があるかもしれませんし、企業であればプロジェクトで使う言語が決められているかもしれません。このような場合は使う言語のコンパイラや実行環境を導入すればいいのですが、個人的に新しい言語を学ぶ場合には、どれを選んでいいのかわからないことは珍しくありません。

いろいろな言語を試してみるには、各言語の実行環境やコンパイラをインストールする必要があり、環境構築に時間がかかります。なかなか言語の勉強に入れず、結局どの言語も中途半端になりかねません。さらに、使ってみたけれど自分には合わなかった、という場合には不要なソフトウェアがコンピュータ内に残ってしまう、ディスクを大量に消費してしまう、などの状況もあるかもしれません。

開発環境を整えるために、どのようなツールを選べばいいのかわからない、という問題もあります。あるプログラミング言語を選んでも、エディタに何を使うのか、IDE(統合開発環境)は何が良いのか、などさまざまな疑問が出てきます。WindowsとMacでは動くソフトウェアが違う、他の人と環境を揃えられない、という問題もあります。

オンライン実行環境を試す

そこで、とりあえず言語の文法を試したい場合にはオンラインの実行環境を使う、というのも一つの方法です。最近はWebサイト上でソースコードを入力して実行できるサービスがいくつも登場しており、Webブラウザさえあれば簡単に試すことができます。

例えば、「Ideone」(https://ideone.com/)や「Wandbox」(https://wandbox.org/)といったサービスを使うと、多くのプログラミング言語を簡単に試すことができます。試したい言語をリストの中から選んで、ソースコードを入力し、実行ボタンを押すだけです。

f:id:itstaffing:20190212140439j:plain

また、HTMLとCSS、JavaScriptを試したい場合は「JSFiddle」(https://jsfiddle.net)のようなサービスを使うと、簡単にWebページのデザインや簡単なスクリプトを試せます。最近よく使われているJavaScriptのフレームワークであるAngular, React, Vue, Gatsby, Next.js, Node.js, Nuxtなどを試す場合には、「CodeSandbox」(https://codesandbox.io)なども便利です。

プログラミング言語だけでなく、データベースなども試したい場合は、「CodingGround」(https://www.tutorialspoint.com/codingground.htm)というサービスもあります。スマホアプリもあり、一部の言語ではオンラインでIDEを使うこともできます。

もしIDEをブラウザで試したい場合は、「Codeanywhere」(https://codeanywhere.com)や「Codenvy」(https://codenvy.com)、「AWS Cloud 9」(https://aws.amazon.com/jp/cloud9/)といったサービスを使うのもいいでしょう(ただし、会員登録やログインが必要になります)。

開発に使うツールを導入する

上記のような方法で開発に使うプログラミング言語を選んだ後は、本格的に開発を始めるために手元で開発環境を構築する必要があります。コンパイラや実行環境をダウンロードしてインストールするだけでなく、ソースコードを入力するために、テキストエディタやIDEが必要です。

テキストエディタとしては、古くからvi(Vim)やEmacsなどが使われてきました。最近では便利な機能を備えたVisual Studio Code(VSCode)、Atom、Sublime Textなどが人気を集めています。その背景には、プログラミングなどに便利な機能を多く備えていて、簡単に使えることが挙げられます。

例えば、「スニペット」と呼ばれる機能により、簡単に入力を補完できます。HTMLを入力するモードにして、「!」記号を入力したあと、Enterキーを押すだけで簡単にHTMLのテンプレートを使用できます。

f:id:itstaffing:20190212140443j:plain

このような機能を使うのに何の設定も必要なく、初期設定のままで用意されている、というのは初心者にとってメリットでしょう。

なお、一部のプログラミング言語では、IDEを使用する方法もあります。IDEを使えば、ソースコードの入力だけでなく、Javaなどで使われるEclipseやNetBeans、C#などで使われるVisual Studio、Objective-CやSwiftで使われるXcodeなどがよく使われています。スクリプト言語でも、PHPのような言語ではPHPStormやIntelliJ IDEAなど開発に便利な機能を備えたIDEが存在しますので、試してみるのもよいでしょう。

PHPの環境を構築する

今回はプログラミング言語として「PHP」を選んだ場合の環境構築を考えてみましょう。多くのレンタルサーバーで標準的に使える言語であり、Webアプリケーションの多くで使われています。また、入門書などの資料も多く、学びやすい言語だと思います。

PHPで開発するとき、手元のパソコンに環境を構築するにはいくつかの方法があります。Windowsの場合はXAMPPなどのツールもよく使われており、インストールするだけでPHPだけでなくWebサーバーやデータベース、FTPサーバーなども一括でインストールできます(https://www.apachefriends.org/jp/index.html)。

ただ、使わない機能も多く、必要な機能だけをインストールしたい場合には個別に導入することもできます。例えば、プログラミング言語のPHPそのものは公式サイト(https://windows.php.net/download/)からダウンロードして解凍するだけなので、インストールの作業は不要です。「C:\php」というフォルダに解凍して、図のように配置してみましょう。

f:id:itstaffing:20190212140447j:plain

コマンドプロンプトを開いて、「C:\php\php ––version」を実行すると、ダウンロードしたバージョンが表示され、正常に動作していることを確認できます。(より便利に使うには環境変数にパスを登録する方法もあります。)

PHPでWebアプリを手元で実行する

Webアプリを実行するには、Webサーバーが必要です。レンタルサーバーを使用する方法もありますが、手元で簡単に試すだけであれば、PHPの「ビルトインWebサーバー」を使う方法もあります。ビルトインWebサーバーはPHPに付属しており、ApacheやnginxといったWebサーバーソフトをインストールしなくても、開発環境として使うには十分なWebサーバーを起動できます。

「C:\php」にPHPをインストールしている場合は、プログラムを配置したフォルダに移動して、コマンドラインで以下のようにオプションとして「–S」を付けたコマンドを実行するだけです。

C:\php\php –S 127.0.0.1:80

これは、ローカルホスト(自分のコンピュータ)を表す「127.0.0.1」の、ポート番号80(HTTP)でビルトインWebサーバーを起動するコマンドで、ブラウザから「http://127.0.0.1/」または「http://localhost/」にアクセスすると、該当のフォルダにあるプログラムをWebアプリとして実行できます。

例えば、以下のようなファイルをindex.phpというファイル名で保存してみましょう。

< ?php

phpinfo();

このページをWebブラウザで開くと、以下のように表示できます。

f:id:itstaffing:20190212140451j:plain

Composerを使って様々な便利機能をインストールする

PHPのパッケージを導入する場合には、依存関係管理ツールであるComposerを使うと便利です。Composerは公式サイト(https://getcomposer.org)からダウンロードしてインストールします(公式サイトの「Getting Started」を選択し、「4. Installation–Windows」の「Composer–Setup.exe」を実行)。

Composerを使うと、さまざまな便利なフレームワークや機能を追加する場合も、コマンドを入力するだけです。例えば、最近人気のあるLaravelフレームワークは、以下のコマンドでダウンロードしてプロジェクトを作成できます。

composer create-project ––prefer–dist laravel/laravel [プロジェクト名]

また、PHPではコードの書式に「PSR–2」と呼ばれるルールがよく使われます。このルールに従っているか確認するために、php cs fixerなどのツールを導入することもあります。これを導入する場合も、以下のコマンドを入力するだけです。

composer global require friendsofphp/php–cs–fixer

php cs fixerはコマンドラインからソースコードをチェック・整形できるだけでなく、Visual Studio Codeなどのエディタにある拡張機能を使えば、エディタでの入力中に、ルールに従っているか確認できます。

このように、便利な機能の導入や管理が可能なツールが、最近のプログラミング言語では用意されていることが多く、簡単に設定できるようになっています。ぜひ業務内容や実現したいこと、好みなどに応じてプログラミング言語を選んで、実際に開発環境を作ってみてください。

【イベントレポート】『カイゼン・ジャーニー』から学ぶ、アジャイル開発とカイゼンの手法

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2018年12月19日のイベントでは「カイゼン・ジャーニー ボクが越境できたわけ ~たった一人からはじめて、「越境」するチームをつくるまで~」を開催。

書籍『カイゼン・ジャーニー』の著者である新井さんが、これまでに自身で実践してきた組織カイゼンの具体的な手法や、新井さんの勤務先、ヴァル研究所で部署を超えてカイゼンの取り組みを行きわたらせた実体験などを紹介してくださいました。

■今回のイベントのポイント
・アジャイル開発について
・カイゼンの手法
・わたしの実体験

【講師プロフィール】
新井 剛さん
株式会社ヴァル研究所 SoR Dept.部長、株式会社エナジャイル取締役COO、Codezine Academy Scrum Boot Camp Premiumチューター、CSP(認定スクラムプロフェッショナル)、CSM(認定スクラムマスター)、CSPO(認定プロダクトオーナー)。Javaコンポーネントのプロダクトマネージャー、緊急地震速報アプリケーション開発、駅すぱあとミドルエンジン開発、駅すぱあとエンジンの部門長などを経て、カイゼン・エバンジェリストとして全社組織をカイゼン中。同時に、アジャイルコーチ、カイゼンファシリテーター、ワークショップ等で組織開発にも従事。Java関連雑誌・ムックの執筆、勉強会コミュニティ運営、イベント講演も多数あり。

アジャイル開発について

「プロジェクトや組織でモヤモヤした問題あるよね?」と感じることは少なくありません。プロジェクトチームを組んでいても、メンバーが同じ時間に同じ場所にただ座っているだけの関係、いわゆるサイロ化された状態では、こうしたモヤモヤは解消されません。

新井さんは、まず、アジャイルという視点から、そうしたモヤモヤした問題をカイゼンサイクルを回しながら解決していく方法論について解説してくれました。

f:id:itstaffing:20190207102520j:plain
▲アジャイル開発とカイゼンサイクルのまとめ

大切なのは、早く軽く失敗して、次に生かすこと。これにより、精神的にも費用的にも時間的にも、無駄が発生せずに済みます。

そして「ふりかえりがとても大事」だと言います。いったん止まって考えることですが、これは失敗を悔いたり、内省や反省をしたりするのでなく、学びの機会、すなわち前進を意味しています。だからアジャイル界隈では「ふりかえり」を、ひらがなで書くことが多いそうです。

また、タイムボックス(期間の箱)で時間を管理することも忘れてはならないそうです。ポイントは、良い気づきの在庫を溜め込まないこと。「倉庫の中にあるものは何も価値を生んでいません。お客さんに届いて初めて価値を生むのです」という言葉にハッとさせられました。

「可視化」と「見える化」はニュアンスが違うというのもポイントです。「可視化」は単に見える状態にすることであり、「見える化」は気づきやフィードバックにつながり、行動につながるカタチにしたものだということ。何でも見えるようにすればよいわけではなく、雑音を取り除いて必要なもの(納期、コミュニケーション)を見えるようにする必要があるのだそうです。

書籍に出てくる手法

カイゼンと言っても、最初から組織単位で進めていくのはハードルが高いもの。そこで新井さんは自分一人で取り組む「ぼっち編」と、チームで実施する「チーム編」とに分けて紹介してくれました。

ぼっち編では、自身のタスクを管理していきます。朝会(といっても一人で行うのですが)で1日の計画を立てタスクボードに乗せ、タスクをマネジメントしていきます。そして定期的に「ふりかえり」を行うのも大切だそうです。

タスクボードは「TODO」「DOING」「DONE」という3つにプロセスを仕分けします。

f:id:itstaffing:20190207102439j:plain
▲タスクボードではプロセスを仕分けする

朝会では、1日の計画を立てます。決められた場所と時間に行うのがコツで、自分の1日のスケジュールなので10分程度でOK。ここで「昨日やったこと」「今日やること」そして「面倒だなと思うこと」を仕分けし1日の計画を立てます。

f:id:itstaffing:20190207102443j:plain
▲朝会のポイント

ふりかえりは1週間に1度、30分以内で行うのがコツだそうです。プロセスやプロダクトのカイゼン、問題の言語化・見える化を行います。

f:id:itstaffing:20190207102446j:plain
▲ふりかえりのポイント

タスクマネジメントで重要なのは、時間を味方につけること。タスクの分割や、誰かに渡したタスクの管理、ヌケモレの防止などを行います。

f:id:itstaffing:20190207102450j:plain
▲タスクマネジメントのポイント

チーム編では、期待マネジメントも重要になります。期待マネジメントとは、互いの期待のギャップを埋めていくこと。これは機を逃さず、ギャップがあると気づいたときに擦り合わせていくことが大切だそうです。

チームビルディングに当たって、新井さんがお勧めするのが、ドラッカー風エクササイズ。主語は自分で、何が得意で、どう貢献するかを自己表明し、仕事をする仲間の価値観を知ります。

f:id:itstaffing:20190207102453j:plain
▲ドラッカー風エクササイズで仕事をする仲間の価値観を知る

プロセスのカイゼンには「ECRS」という手法があります。これは排除・結合・交換・簡素化のそれぞれの頭文字をとったものです。

f:id:itstaffing:20190207102457j:plain
▲プロセスをカイゼンするECRSとは?

A⇒B⇒Cというプロセスがあるとき、ECRSでは次のようにカイゼン策を検討します。

f:id:itstaffing:20190207102501j:plain
▲プロセスカイゼンの考え方

わたしの実体験

ここまでは新井さんの書籍をベースにしたカイゼンの手法について学びましたが、今回は新井さん自身の実体験も聞かせてもらえました。

新井さんは、転職を2回、社会人になってからの海外留学を経験しており、ヴァル研究所は3社目になるとのことです。中途採用で後から職場にやってきた人が、職場の仕事スタイルをガラリと変えるのには相当な苦労があったのではないかと想像してしまいます。

転職や留学の経験から、同期がいない、知り合いゼロ、土地勘ゼロでのスタートを繰り返しており、みずから「ぼっち」を選んでいるのかと悩んだこともあったそうです。

f:id:itstaffing:20190207102505j:plain
▲新井さんのアジャイル~カイゼンへの取り組み

その第一歩は、ヴァル研究所に入社し、CI(継続的インテグレーション)ツールを自身のプロジェクトに導入し、個人的にアジャイル開発に興味を持ったことだそうです。

何人かの若手が同時多発的に、夕方に読書会や勉強会を自主開催するようになり、やがて全社で認められるようになりました。

たまたまヴァル研究所がそうした取組みに理解があったというわけではありません。ヴァル研究所は、まだインターネットが普及する前に、電車の乗り換え案内ソフト「駅すぱあと」をリリースし、古くからのパソコンユーザーには馴染みのある企業で、新井さんいわく「昭和なスタイルの会社」だそうです。社内には、最初の「駅すぱあと」を開発した60代のベテランエンジニアを筆頭に、50代のエンジニアも数多く在籍しており、当初、なかなか全社に行きわたらせることができませんでした。

しかし、社内の2~3チームでアジャイル開発が導入されていくと、周囲にもアジャイルに興味を持つ人が増えてきます。新しいもの好きは、どこにでも少なからず存在していて、そうした人たちを軸に、次第に広がりを見せていき、やがて多くの社員たちもカイゼンやアジャイルの取り組みに参加するようになりました。

現在は、社内のいたるところに無数の付箋紙が張られたホワイトボードが置かれるようになったとのこと。しかも、開発部門だけでなく、総務部や監査チームでのカイゼンや、販売促進チームでの残業管理などにも同じ手法で取り組んでいるそうです。

f:id:itstaffing:20190207102510j:plain
▲社内のいたるところに付箋紙の張られたホワイトボードがあるヴァル研究所の社内

ソフトウェア開発の新しい試みにモブプログラミングというものがあります。これは、複数名がキーボード1個で開発していく手法のこと。たとえば総務部門では、採用のスカウトメールの執筆に、複数名が1台の端末を囲んで1通のメールを仕上げていくモブプログラミングならぬモブワークを実践しているそうです。

f:id:itstaffing:20190207102515j:plain
▲開発部門だけでなく、総務部や販売促進チームでもモブワークを行っている

最後に新井さんからのアドバイスがありました。

職場でこうしたカイゼン手法を導入しようとすると、全員が賛同することはまずありません。知的好奇心旺盛なエンジニアや、何かを変えることに対して前向きで気が利くメンバーにフォーカスを当てて、巻き込んでいくのが成功への秘訣だそうです。そして、始めるのに遅すぎることはなく、行動するべきだと思ったときにスタートするべきだと締めくくってくれました。

今回のイベントでは、アジャイル開発やカイゼンの手法だけでなく、新井さんの所属するヴァル研究所の取り組みにも驚かされました。「ぼっち」から始めてここまで全社に行きわたらせたことに感動するとともに、まずはスモールスタートでもいいから行動することの大切さを教えていただきました。派遣スタッフから、就業先の雰囲気までいきなり変えるのは難しいかもしれませんが、朝会など、できることはたくさんあるでしょう。小さく、始めてみませんか?

増井敏克の「情報のキャッチアップが足りない」ときに読むコラム 第3回 AIでできること、できないこと

f:id:itstaffing:20190123133701j:plain

「人間の仕事がAIに取って代わられる」など、なにかと耳にするAIについて。きちんと理解していないと、日々更新されるAI関連のニュース記事を読むと不安が募る…なんて方もいらっしゃるかもしれません。AIへの理解を深めるとともに、AIにできること、できないことを知ることで未来への考え方も変わりそうです。今回のコラムで、一度キャッチアップしてみませんか。

【講師】増井 敏克さん
【講師】増井 敏克さん
増井技術士事務所代表。技術士(情報工学部門)。情報処理技術者試験にも多数合格。ビジネス数学検定1級。「ビジネス」×「数学」×「IT」を組み合わせ、コンピュータを「正しく」「効率よく」使うためのスキルアップ支援や、各種ソフトウェアの開発、データ分析などを行う。著書に『おうちで学べるセキュリティのきほん』『プログラマ脳を鍛える数学パズル』『エンジニアが生き残るためのテクノロジーの授業』『もっとプログラマ脳を鍛える数学パズル』『図解まるわかりセキュリティのしくみ』(以上、翔泳社)、『シゴトに役立つデータ分析・統計のトリセツ』『プログラミング言語図鑑』『プログラマのためのディープラーニングのしくみがわかる数学入門』(以上、ソシム)がある。

作りたい「人工知能」のイメージを考える

中小企業の社長さんとお話ししていると、人工知能がブームであるという話から、「ドラえもん」みたいなことができるようにならないの?という声を聞きます。ただ、このような話を聞いたときに私が思うのは、コンピュータがどのような動作をすれば「賢い」と感じるのか、という点です。

「人工知能」という言葉から想像するのは、私たちが使っているコンピュータよりも「賢い」動作をしている姿です。ただ、「ドラえもん」は便利な道具は使っていますが、「賢い」とは言えないのではないかと思っています。自分で考えて行動する、「鉄腕アトム」のような存在が理想ではないでしょうか?

例えば、エアコンの制御を考えたとき、現在のエアコンはリモコンなどを使って冷房や暖房、温度設定を行うと思います。このように人間が操作をしている状況は、あまり賢いとは言えません(もちろん、指定した温度に調整する、という機能は素晴らしいと思いますが)。

では、「賢い」エアコンとは何かを考えてみます。例えば、部屋にセンサーを設置し、室温が15度以下になると自動的にエアコンのスイッチが入るようにしてみましょう。人間がエアコンを操作しなくても、センサーによって自動的に動作します。この方法は現在より賢くなったように思いますが、スイッチを入れる温度は人間が設定する必要があります。

f:id:itstaffing:20190123133704j:plain

人によって快適な温度は異なるため、「温度設定」は必要なように思うかもしれませんが、これもなくすことを考えてみましょう。設定しなくて済むように、人間の操作を記録して再現する方法があります。

例えば、住人が10日間操作したことを記録し、そこから規則性を学習して使うことを考えます。最初は人間の操作が必要ですが、温度を設定している、ということを意識することなく、自動的に温度設定が可能になります。こうなると、こどもが学習して成長するように、エアコンが賢くなったと感じるのではないでしょうか?

f:id:itstaffing:20190123133707j:plain

機械学習とディープラーニングの概要

現在の人工知能の研究で使われている「機械学習」は上記のような考え方に基づいています。つまり、人間が決めたルールや人間が作ったプログラムに沿って動くのではなく、人間が作った学習プログラムと予測プログラムに対し、データを与えるとルールを自動的に生成し、そのルールに沿って予測プログラムが処理する、といった動作をします。

f:id:itstaffing:20190123133710j:plain

そして、これを実現するために使われているのが「ニューラルネットワーク」です。ニューラルネットワークは機械学習を実現する技術の一つで、それを発展させたものが最近話題の「ディープラーニング」です。

ニューラルネットワークは人間の脳を模倣した構造で、入力層に対して入力データを与え、出力層から出力されたデータと教師データを比較して重みを更新する、という仕組みになっています。

f:id:itstaffing:20190123133713j:plain

もっとシンプルに、「入力から出力を得る関数」をイメージすると、これまでは「入力」と「関数」を人間が与えると、コンピュータが出力を生成しました。しかし、機械学習では「入力」と「出力」を与えたときに「関数」をコンピュータが考える、と言うことができます。

f:id:itstaffing:20190123133716j:plain

ニューラルネットワークの階層を何段にも多層化したものが「ディープラーニング(深層学習)」です。これまでもニューラルネットワークを多層化する、という方法は考えられていましたが、コンピュータの高性能化やデータの増加などがあり、現実的な時間で高い精度が得られるようになったという背景があります。

また、これまでの人工知能の研究といえば、大学などを中心に行われていたのに対し、最近のディープラーニングの研究は企業などを中心に行われていることも特徴の一つです。そして、どんどん私たちの身近なところにAIが導入されてきています。

AIによってなくなる仕事

囲碁や将棋などにおいて、コンピュータが人間を超えた、というニュースは話題性もあり、多く報じられています。ただ、人間を超えるコンピュータが登場しても、棋士という仕事がなくなることはなさそうです。

一方で、AIが登場するまでもなく、なくなっていった仕事はたくさんあります。例えば、駅で切符を「切る」仕事は自動改札で大幅に減り、Suicaなどの電子マネーによって「切符」という姿も失われつつあります。また、高速道路の料金所などはETCカードの登場により、エレベーターガールや受付などは自動音声やタッチパネルなどにより不要になりつつあります。

その他にも「マニュアルに沿って行う仕事」があります。マニュアルが作れる、ということはそれをプログラムで実装すれば実現できます。現在実現されていないのは、現実的に高価なハードウェアが必要である、故障時の対応が必要である、といった理由があり、コスト面で見合わないと考えられます。このように、現在は実現するためのハードルが高いような仕事も、AIとは関係ないかもしれませんが、今後はなくなっていくかもしれません。

むしろAIによって置き換えられるものとして、専門的な知識が必要な場合でマニュアル化できないように思えても、「誰に頼んでも結果が同じ」ものが考えられます。通訳や翻訳、税理士の書類作成業務や弁護士の判例調査、医師の診断などといったものは専門的な知識が必要ですが、基本的には求める結果が変わらないものです。

つまり、こういった仕事を行なっている専門家は業務の一部が不要となり、オリジナリティのあるコンサルティングなどが求められると言えそうです。

AIが進化してもなくならない仕事

逆になくなりそうにないものとして、「新しいものを考える仕事」があります。「教師データ」をもとに行われる機械学習を考えると、データがない=前例がないものは現在の方法では実現が難しいと言えます。似たものは作ることができたとしても、それでは意味がありません。

また、「人」であることが大切な仕事もなくなりそうにありません。囲碁や将棋だけでなく、スポーツ選手やアイドル、ミュージシャンなどは「人」を見ることが目的です。毎回同じ結果が得られない、結果がどうなるかわからないものにはワクワク感があります。このように「人」や「人の行動」が求められる仕事、共感が得られるような仕事も「人」ならではだと思います。スポーツのインストラクターなどの「教える仕事」も、「人」だからこそ意味がありそうです。

ただし、現在は心理的なハードルによって「人」でないと嫌だと思っている仕事でも、今の若い人が歳を重ねて世代が変わると一気に進む可能性があると感じています。例えば、身体に触れられるのは嫌だと感じる人が多いため、美容師や理容師といった仕事は、特に女性では抵抗があるかもしれません。しかし、マッサージ機などは機械でも十分だと感じる人は少なくないことを考えると、今後はどうなるかわからないとも言えそうです。

同様に、保育や介護の現場では、人に手伝って欲しいと思う一方で、若い世代であれば機械でも違和感がない、という可能性も。

このように、未来のことはどうなるかわからない一方で、今後は「他の人がやると違う結果になる仕事」こそ、これまで以上に求められる時代が来るのではないか、と感じています。エンジニアとして働く皆さんの活躍の幅は、ますます広がりそうです。AIに関してだけでなく、旬な話題を「なんとなく知っている」から、もう一歩理解を深めたいと思ったときに、本コラムを今後もご活用ください。

【イベントレポート】数理最適化を理解して、機械学習の中身を知ろう

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2018年12月5日のイベントでは「機械学習の中身を理解する」と題して、書籍『機械学習のエッセンス』の著者である加藤公一さんを講師にお迎えし、機械学習アルゴリズムの仕組みを理解するために必要な知識について解説していただきました。機械学習の仕組みを理解する上で、どんな知識が必要か、読み進めるうちにわかってくるでしょう。

■今回のイベントのポイント
・数学はデータサイエンティストの必須知識?
・機械学習に必要な数学
・数理最適化の基本
・機械学習のアルゴリズム

【講師プロフィール】
加藤 公一さん
シルバーエッグ・テクノロジー株式会社チーフサイエンティスト。レコメンデーション(自動推薦)システムに関する研究開発に従事。特に機械学習アルゴリズムの設計・実装を得意としている。博士(情報理工学)。著書に『機械学習のエッセンス』(ソフトバンククリエイティブ)など。

数学はデータサイエンティストの必須知識?

冒頭で、加藤さんは書籍『機械学習のエッセンス』の執筆裏話や、込められた思いなどを話してくれました。

機械学習を根本から理解するには、数学の知識が求められます。しかし最近は、機械学習をプログラムに取り入れる場合でも、手軽に利用できるライブラリが用意されているため、イチから自分で作らないことがほとんど。加藤さんの書籍は、そうしたライブラリに頼ることなく、きちんと中身を理解した上で、それを実装して中身を理解していこうという試みだそうです。

近年では「大人の数学勉強やり直しブーム」などもあり、同書も、数理最適化から機械学習へのアプローチを解説した内容になっています。ただ、「データサイエンティストは数学の必須知識か?」という問いに対して加藤さんは「多分NO!」であると答えます。

「データサイエンティストは全員、数学ができるかというと、そうでもありません。しかし、数学ができることは他のデータサイエンティストとの差別化につながります」というのが加藤さんの考え。複数の選択肢の中で「面白いと思うこと」を優先してやるのはよいキャリアアップ戦略になるとのことです。

機械学習に必要な数学

今回紹介する「数理最適化」とは、与えられた制約の中で、関数を最小化(または最大化)すること。機械学習のアルゴリズムは、数理最適化に帰着することが多いということで、数理最適化について知っておくと、根本理解が進みます。

そして数理最適化を理解するには、「線形代数」と「微積分」という高等数学の知識が必要になります。これらは高校で習う数IIBや数IIIC、あるいは大学の授業で学ぶ数学の領域です。「よし、機械学習を勉強するぞ!」と思い立ったものの、数式を見て撃沈する人も多いのが現状です。

実際に今回も、高度な数式が多数登場しました。すべてを理解することは難しくても「身近なライブラリの中身が、そうした考え方で作られている」ということが分かれば、機械学習への向き合い方も変わってきそうです。

数理最適化の基本

まずは行列とベクトルから。今回はSVM(サポートベクタマシン)で使われる「距離の公式」に絞って紹介してくれました。サポートベクタマシンとは、機械学習における「教師あり学習」を用いるパターン認識モデルのことです。

距離の公式を知る前に、まずはベクトルの内積について解説してくれました。

f:id:itstaffing:20190116144730j:plain
▲ベクトルの内積について。ベクトルaとベクトルbの内積が0になるときベクトルaとベクトルbは垂直の関係にある

これを平面に展開すると次のように考えられます。

f:id:itstaffing:20190116144733j:plain
▲平面の方程式。法線ベクトルとの内積がゼロの場合、xは平面上にある

これらを踏まえた距離の公式が次のようなものだそうです。

f:id:itstaffing:20190116144737j:plain
▲距離は、どれだけ離れているかを表すため、絶対値やノルムで表す

距離の公式を理解するためにベクトルや行列の知識が必要だったように、「勾配降下法」そして「ラグランジュ未定乗数法」を理解するために、微分や偏微分の知識が必要となります。イベントでは微分や偏微分についても、基礎を解説してくれたのですが、ここでは割愛します。

f:id:itstaffing:20190116144740j:plain
▲勾配は∇fは、n個の変数で偏微分し並べたものであり、幾何学的にはこのような性質を持つ

勾配降下法では、-∇fの方向に少し進むと関数の値が小さくなるだろうという考え方で、ひたすら勾配方向に進むことを繰り返して極値を求めていきます。

f:id:itstaffing:20190116144743j:plain
▲たとえば、図中の等高線のうち一つの輪がf=10のときの点の集まり、その内側がf=9のときの点の集まりとすれば、勾配降下法により関数の値を最小化させていくことで谷底(極値)にたどりつく(かもしれない)

ディープラーニングは、まさに勾配降下法のようなイメージで、たとえば犬と猫を判別するのであれば、繰り返しの学習により、判別誤差を小さくすることで、精度を上げていくのだそうです。

もう一つ、ラグランジュ未定乗数法は、いくつかの変数に対して、いくつかの関数の値を固定するという束縛条件のもとで、別のある1つの関数の極値を求めるための方法です。

f:id:itstaffing:20190116144746j:plain
▲KKT条件(カルーシュ・クーン・タッカー条件)を用いた解法では、不等式制約も扱える

具体的な解を導く手順は次のようになります。

f:id:itstaffing:20190116144749j:plain
▲ラグランジュ未定乗数法で不等式成約を扱う際の考え方

そして、いよいよサポートベクタマシン(SVM)の数学的な解説へ進みます。

f:id:itstaffing:20190116144753j:plain
▲サンプルは単純に直線で分けられるものとして、与えられた2種類の点列(赤と青)を分類したいというケースについて考える

入力データが予想と合っていれば1(正)、間違っていれば-1(負)のラベルを付与し、分類するための直線から点の距離が一番大きくなるように、先ほどの距離の公式を用いると、次のような式が成り立ちます。

f:id:itstaffing:20190116144756j:plain
▲ωは何倍しても正解になるので最終的な式をシンプルにすることができる

これをラグランジュ未定乗数法のラグランジュ関数に当てはめると次のようになります。

f:id:itstaffing:20190116144801j:plain
▲ラグランジュ関数に当てはめた結果の式はこうなる

そして、∇L=0を計算した結果を元の式に当てはめると、次のような式になり、これを解いていきます。

f:id:itstaffing:20190116144806j:plain
▲最終的な式。プログラムへの具体的な実装は書籍を参照して欲しいとのこと

アルゴリズムとしては、目的関数の改善に寄与する「よい」i,jを選択しながら、a_i,a_jを更新していきます。

最後に、加藤さんから
「線形代数はちゃんとした教科書で学んだほうがよい」
「教科書を通読する必要はなく、必要に応じて読み直すのがよい」
「コンピュータを使わずに計算するのも訓練として必要」
といくつかアドバイスがありました。

今回のイベントは、これまでと違い、数式が次々と登場するもので、まるで大学の講義のような雰囲気でした。勾配降下法やラグランジュ未定乗数法など、統計学や流体力学などを専門に学んだ人にしか馴染みのなさそうな知識も登場し、限られた時間の中では、すべて理解するのは難しいです。しかし、機械学習が内部でどのようなことをしているのか、その一端に触れられたことで、興味が湧いたり、改めて数学の学習意欲が出たという参加者が多かったです。レポートを読まれている皆さんも、ぜひこれを皮切りに、機械学習の仕組みへの理解を深めてみてはいかがでしょうか。

【イベントレポート】5年後に市場を席巻する近未来のコア・テクノロジーの進化と相互作用を理解し、未来の展望を予測する

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2018年11月14日のイベントでは「5年後に市場を席巻する近未来のコア・テクノロジー 技術の進化と相互作用を理解し、未来の展望を予測する」と題して、書籍『近未来のコア・テクノロジー』の著者である三津村さんを講師にお迎えし、技術進歩の著しい昨今、エンジニアが押さえておくべき「コア・テクノロジー」について解説していただきました。

■今回のイベントのポイント

・進化の核となるテクノロジーを押さえるべき理由
・ブロックチェーン
・量子コンピュータ
・テクノロジーの相互作用と社会の変化

【講師プロフィール】
三津村 直貴さん
合同会社Noteip代表。フリーライター。米国の大学でコンピューターサイエンスを専攻し、卒業後は国内の一部上場企業でIT関連製品の企画・マーケティングなどに従事。退職後はライターとして書籍や記事の執筆、WEBコンテンツの制作に関わっている。人工知能の他に科学・IT・軍事・医療関連のトピックを扱っており、研究機関・大学における研究支援活動も行っている。
著書『近未来のコア・テクノロジー』(翔泳社)『図解これだけは知っておきたいAIビジネス入門』(成美堂)、執筆協力『マンガでわかる人工知能』(池田書店)など。

進化の核となるテクノロジーを押さえるべき理由

いまや、次なる新しい技術が登場するまでのスパンが短くなっていて、鍵となる技術を追いかけるのが難しくなっています。専門分野ではないから、自分に関わりがないからと、新しい技術が登場しても、詳しい内容を知ろうとしないことも多いはず。しかし、三津村さんは「重要な核となる技術については基本だけでも押さえておくことが大切だ」と訴えます。

f:id:itstaffing:20190109115457j:plain
▲核となる技術を押さえておけば、そこから派生する数々の技術が新たに登場した際も理解が早く、世の中のニーズをつかみやすい

エンジニアとしてのキャリアを考える際にも、これは大きく役立ちそうです。
三津村さんが解説してくださった「情報社会を変える5つのテクノロジー」は次のもの。

・ニューラルネットワーク
・データマイニング
・ブロックチェーン
・ロボティクス
・量子コンピュータ

それぞれ詳しく紹介してくださったのですが、このレポートでは、ブロックチェーン、量子コンピュータの内容をご紹介します。

ブロックチェーン

最近何かと話題に上る仮想通貨。その仮想通貨を実現するためのコア・テクノロジーとして知られているのがブロックチェーンです。

f:id:itstaffing:20190109115501j:plain
▲ブロックチェーンは、その名の通り、ブロック化されたデータが、チェーンでつながって、保存されるという仕組み。すべての記録が残るため、データの改ざんがすぐに分かってしまうので、データの信頼性が非常に高い

ブロックチェーンの考え方は、ソフトウェア開発のバージョン管理に利用されるGitなどにも通じているそうです。

私たちが普段使っているお札や硬貨などのリアル通貨は、国が信頼性を保証してくれます。一方で、仮想通貨は、ブロックチェーン技術が信頼性を保証してくれます。

f:id:itstaffing:20190109115504j:plain
▲仮想通貨の信頼性はブロックチェーン技術が担保している

ブロックチェーンの信頼性の根拠は、すべてのユーザーによる情報共有と多数決による信任投票により、信頼すべきデータにブロックを追加していくところにあります。

新しくデータを追加するときには“多数決による信任投票“を行います。これは、“クイズ“を計算によって解き(これをマイニングと呼びます)、解けた人がブロックを追加できるというルール。そうして一番長くなったブロックが信頼できるデータということになります。

f:id:itstaffing:20190109115507j:plain
▲投票する権利はマイニングした人のみ。誰でも最も長くブロックが付いているデータがどれかが分かるので信頼できる

また、すべての履歴を保存しているため、データが改ざんされた場合も、他のユーザーがそれを簡単に知ることができるというのが、信頼につながっています。

仮想通貨が興味深いのは、このブロックチェーンの特性により、信頼性を保つためのインセンティブ設計が施されているところ。つまり、データを改ざんすると、仮想通貨の価値が下がってしまうため、改ざんしてまで入手する意味が無くなってしまいます。それなら、マイニングをしていたほうが良いと考えるので、信頼性が保たれています。

ブロックチェーン技術の普及により、さまざまなことが予測されています。
たとえば、ブロックチェーン技術を使って帳簿を作ると、決算や会計処理などで、数字を勝手に書き換えるといった不正ができなくなるそうです。

f:id:itstaffing:20190109115510j:plain
▲データセンターが減るという予測は気になりますね

量子コンピュータ

量子コンピュータといっても、実は決まった定義があるわけではなく、量子特有の現象を演算に応用したものを一般にこう呼びますが、演算に利用可能な量子現象も一つではないそうです。

量子の状態は確定せず、常にゆらいでいます。粒子のようなふるまいと波のようなふるまいをするという性質を合わせ持っているのも、その一つです。重ね合わせの状態で表現された情報の最小単位を1量子ビットと呼びます。

ただし、1量子ビットあたりの情報量は、方式によって変わるため、処理できる量子ビットの数が、そのまま性能にはつながりません。

三津村さんによれば量子コンピュータは「まだ研究・開発途上にあり、特定分野で実用化されているものの、万能型の量子コンピュータは、まだ無い」とのことです。

f:id:itstaffing:20190109115515j:plain
▲現在、研究されているものとしてゲート方式とイジング方式という2つのタイプがある。それぞれ特定の分野には適しているが、汎用的ではない

量子ゲート方式は、私たちが使っているコンピュータと考え方は似ていて、量子版の論理ゲートを利用して重ね合わせの状態を、行列で計算するというものだそうです。

f:id:itstaffing:20190109115518j:plain
▲論理ゲートには量子用のアルゴリズムを使う必要があること、量子はコピーできないため、エラーチェックが難しいなどの課題もあるとのことです。

一方の量子イジング方式は、イジング模型と呼ばれるモデルを量子によって再現するもので、このモデルで表現可能な組み合わせ構造化問題を解決できるといいます。

ゲート方式はまだ実用化されておらず、普及しているのはイジング方式のほうだそうです。

f:id:itstaffing:20190109115521j:plain
▲組み合わせ爆発を最小化できることで、さまざまな問題解決に利用できるものと期待されている

イジング方式では、組み合わせ爆発を最小化することができるという特長があります。たとえばコンピュータのアルゴリズムでも目にする数学問題である「巡回セールスマン問題」は、巡回する場所を1つ増やすだけで巡回パターンが指数関数的に増えてしまいます。同種の問題は世の中にも数えきれないほどあるため、イジング方式の量子コンピュータには大きな期待がかかっています。

そのほかにも、量子コンピュータの実現により期待されている分野がいくつもあります。

たとえば、情報分野での強固な暗号化、物流分野の配送ルートの最適化、材料化学分野では組み合わせによる新素材の開発、薬品分野ではタンパク質の組み合わせによる新薬の創薬、クラウド量子コンピュータの登場など、いずれも私たちの暮らしの安心や便利につながるものとなるでしょう。

テクノロジーの相互作用と社会の変化

三津村さんによれば、今回紹介してくださった5つのテクノロジーは「それぞれが単体でビジネスに使われることは、まずない」とのこと。

たとえば、ニューラルネットワークの学習データはデータマイニングによって収集されます。そして、そのデータで学習を済ませたニューラルネットワークはデータマイニングの性能向上に役立てることが可能となります。
また、IoT機器はセキュリティが弱い面がありますが、ロボティクスとブロックチェーンを組み合わせ、IoT機器のデータをブロックチェーン化することでデータの改ざんを防ぐことができます。

このように、いくつかのコア・テクノロジーが組み合わさることで価値のある技術へと進化していきます。
今回のイベントでは、これまでに何度か目や耳にしたテクノロジーもあれば、今まで聞いたこともないテクノロジーもありました。特に、量子コンピュータというものが一部とはいえ、実現しているということに驚いた、という声が多かったです。これからの技術の発展に、注目です。

【イベントレポート】DockerとKubernetesでアプリケーション開発にコンテナをフル活用!

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2018年11月7日のイベントでは「DockerとKubernetesでアプリケーション開発にコンテナをフル活用!」と題して、コンテナ型の仮想サーバーソフトウェアであるDockerにフォーカス。システム開発環境から本番環境の構築まで、幅広い用途に利用され、サーバエンジニアはもとより、ソフトウェア開発エンジニアからも注目されています。
書籍『Docker/Kubernetes実践コンテナ開発入門』の著者である山田明憲さんを講師にお迎えし、Dockerの基礎から活用までをレクチャーしていただきました。

■今回のイベントのポイント

・Dockerとは?コンテナとは?
・Dockerを体験する
・Dockerフレンドリなイメージをつくる
・コンテナオーケストレーションとは?
・Kubernetesでの実践的なアプリケーション開発
・パブリッククラウドでのコンテナ運用
・コンテナの運用を支えるツール

【講師プロフィール】
山田 明憲さん
2012年、株式会社サイバーエージェント入社。ライブ配信サービス「FRESH LIVE」のテックリードを務める。著書として「Docker/Kubernetes 実践コンテナ開発入門(技術評論社刊)」。バックエンド技術を中心に、SRE、DevOps等が守備範囲。

Dockerとは? コンテナとは?

最近よく耳にするDockerとはいったい何か?山田さんは、イチから説明してくれました。

サーバの仮想化技術は、ホストOS型とコンテナ型の2つに分けられます。

f:id:itstaffing:20181226145005j:plain
▲Dockerはコンテナ型の仮想化技術。ホストOS型とコンテナ型、それぞれに長短がある

Dockerは、アプリケーション、ライブラリ、設定もコンテナ内に含まれるため、優れたポータビリティをもたらしてくれ、インフラを気にせずアプリケーションをデプロイできるという点が開発者に支持されているそうです。

Dockerを体験する

さっそく、Dockerで環境を構築してみます。

ローカルPC上でDocker環境を構築するには、PC用のアプリケーションであるDocker Desktopを利用します。Docker Desktopをインストールし、仮想環境イメージであるDockerイメージを取得し、Dockerコンテナを実行するという手順になります。

f:id:itstaffing:20181226145009j:plain
▲Docker Desktopの画面

Dockerイメージとは、コンテナを構成するファイルシステムやアプリケーション、設定などをまとめたもので、コンテナとは、その内容を具現化したものです。

多数のイメージがアップロードされているサイトDocker Hubからイメージをダウンロードします。今回は、山田さんが執筆された書籍で使用しているサンプルをダウンロード。これはHTTPでGETリクエストを送信すると「Hello Docker!!」というメッセージを返すという、ごくシンプルなサーバが稼働するDockerイメージです。

f:id:itstaffing:20181226145012j:plain
▲docker image pullコマンドでダウンロードし、docker container runコマンドで実行。オプションでポート9000を、コンテナのポートの8080にフォワードしている。これによりポート9000にGETリクエストを送ると、仮想サーバ環境のポート8080にフォワードされる

結果は、見事にメッセージが表示されました。

次に、Dockerイメージをビルドする方法も紹介してくれました。まず、アプリケーションを用意し、配置します。

f:id:itstaffing:20181226145017j:plain
▲実行したいスクリプト(ここではhelloworld)とDockerFileを配置する

DockerイメージをビルドするにはDockerFileを用意します。

f:id:itstaffing:20181226145020j:plain
▲DockerFileの内容。FROMはベースイメージ、COPYは実行させたいアプリケーションへのパス、RUNでchmodにより実行権限を与え、CMDでコマンド名を指定する

用意できたら、イメージをビルドします。

f:id:itstaffing:20181226145023j:plain
▲docker image buildコマンドでイメージをビルド。docker image lsコマンドでイメージファイルが作成されたかどうかを確認

Dockerフレンドリなイメージをつくる

コンテナは複製しやすいのですが、デプロイする環境によって、たとえばデータベースの接続先や、アプリケーション参照するAPIのホストを変えるなど、デプロイする環境に応じて制御してあげる必要があります。

こうしたコンテナの挙動は、あらかじめ指定しておくことで制御できます。その方法として「実行時の引数で指定する」「アプリケーションの設定ファイルをデプロイ先ごとに変更する」「環境変数を使う」の3つがあります。

山田さんによれば「環境変数は、変数を1箇所だけ変えて試すなど、小回りが利くため、トライアンドエラーしやすいのでお勧めです」とのこと。具体的には、アプリケーションの設定ファイルの記述に環境変数を利用します。

f:id:itstaffing:20181226145026j:plain
▲Springフレームワークの設定ファイルpropertiesの例

そして「Docker上でアプリケーションを開発する場合は、動作を指定するのに、環境変数を参照できるように設計しておくことがポイント」だそうです。

コンテナオーケストレーションとは?

コンテナを使って本格的にアプリケーションをデプロイするようになると、デプロイするコンテナも増えていきますが、コンテナの配置が難しくなります。

「どのコンテナをどのように配置するか?」「ホストのマシンリソースを効率的に使う配置はどうなるか?」「コンテナへのアクセス経路をどう決めるか?」「スケールアウト/インをどのように行うか?」など、考えなければいけない要素が膨れ上がります。

f:id:itstaffing:20181226145030j:plain
▲コンテナ数が増えていくと、その配置はもはや人間が考えることではなくなる

これを解決するのが、複数のホストを跨ぎ、複数種のコンテナを矛盾のない形でサーバリソースを考慮しながら効率的に配置するのが「コンテナオーケストレーション技術」です。

代表的なコンテナオーケストレーション技術として、Docker Compose、Docker Swarm/Stack、Kubernetes、Apache Mesos、Amazon Elastic Container Service(ECS)などがありますが、デファクトスタンダードと呼べるのがKubernetesだそうです。

Kubernetesでの実践的なアプリケーション開発

Kubernetes(クバネティス、クーベルネィティス)は、Google社内のコンテナ基板から派生した技術で、現在はOSSとして公開されています。Docker DesktopにもKubernetes統合の機能が用意されています。

f:id:itstaffing:20181226145033j:plain
▲Docker DesktopのKubernetes統合をオンにすると、コマンドラインツールkubectlがインストールされ、Kubernetesクラスタのリソースを操作・閲覧ができるようになる

kubectlで操作するKubernetesのリソースとは「アプリをデプロイさせるために必要な部品のようなもの」と考えればよいそうです。

今回はKubernetesのリソースの中から、Pod、Deployment、service、ingressの4つについて解説されました。

Podはコンテナをグルーピングするためのもので、これによりPod単位で複数のコンテナをまとめてデプロイできます。

f:id:itstaffing:20181226145037j:plain
▲Nodeを跨ぐことはできないが、コンテナをまとめて扱える

Podは1つのマニュフェストファイルにつき1つしか作成できませんが、実運用では同じPodを大量に複製することで可用性を高めます。これを実現するのがDeploymentです。

f:id:itstaffing:20181226145039j:plain
▲ReplicaSetによりPodが複製され配置される。これをコントロールするリソースがDeployment

そして、Podの集合に対するルーティングやサービスディスカバリ機能を提供するリソースがServiceです。

f:id:itstaffing:20181226145043j:plain
▲Serviceはルーティングやディスカバリだけでなくロードバランシングの機能も提供する

Serviceは、クラスタ内部にしかサービスを提供できませんが、これをクラスタの外部に公開するためのリソースがIngressです。アプリケーションを外部に公開するにはIngressの設定が必要になるそうです。

パブリッククラウドでのコンテナ運用

Kubernetesをゼロから構築していくのは大変です。そこで利用したくなるのが「Kubernetesマネージドサービス」です。GKEならば、数分でKubernetesクラスを構築可能だそうです。サービスは、Google(GKE)やAmazon(EKS:東京リージョンでは未提供)、Microsoft(AKS)などが提供されていますが、山田さんによれば、KubernetesはGoogleのプロジェクトから生まれたこともあり、GKEのサービスが一番進んでおり、EKSやAKSが後を追っている状況だそうで、「現状ではGoogleのGKEが現実的な選択肢」とのことです。

コンテナの運用を支えるツール

コンテナが増えるとログを管理するのも大変です。最後に、実運用時に便利な、コンテナ運用を支えるツールをいくつか紹介されました。

f:id:itstaffing:20181226145046j:plain
▲「Elasticsearch+Kibana」は、全文検索でコンテナのログの保存と可視化を行うツールで、対象のコンテナがどこで動いているかを把握するのに便利とのこと

今回のイベントは、以前から興味のあったDockerでしたが、短い時間でコンテナの実行から、イメージの作成、デプロイまで、概念のみならず具体的な手順やノウハウまで学ぶことができました。PC上でも動かせるので、自分で試してみたくなった方も多いはずです。注目の技術なだけに、これを機に理解を深めましょう。

【イベントレポート】注目のテーマ、ディープラーニングを知識ゼロから学ぼう

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2018年10月31日のイベントでは「知識0から始めるディープラーニング 本格的AI開発」を開催。書籍『はじめてのディープラーニング』の著者である我妻幸長さんが、ごくシンプルなディープラーニングモデルを使って、ディープラーニングの基礎からわかりやすく解説してくださいました。

■今回のイベントのポイント

・人工知能、ディープラーニングとは
・人工知能と数学
・ディープラーニングの実演
・Swiftによる深層強化学習

【講師プロフィール】
我妻 幸長さん
「ヒトとAIの共生」がミッションの会社、SAI-Lab株式会社の代表取締役。AI関連の教育と研究開発に従事。東北大学大学院理学研究科修了。理学博士(物理学)。著書に「はじめてのディープラーニング」(SBクリエイティブ)、「No.1スクール講師陣による 世界一受けたいiPhoneアプリ開発の授業」(技術評論社)。オンライン教育プラットフォームUdemyで、2万人以上を指導する人気講師。エンジニアとして、VR、ゲーム、SNSなどジャンルを問わず様々なアプリを開発し、数々の技術関連イベントに登壇。

人工知能、ディープラーニングとは

最初にディープラーニングについての紹介がありました。その中でも面白かったのが「AIには強いAIと弱いAIがある」というお話。強いAIは、生物の知能に迫るAIで、ドラえもんや鉄腕アトム、スターウォーズに登場するC3POのような汎用的なものですが、これはまだ実現していません。いっぽうの弱いAIとは、限定的な問題解決や推論に使われるもので、こちらは画像処理や機械制御、音声による会話、文章の認識や作成など、各分野での利用が始まっています。

AIのカテゴリの中には、機械学習のような脳の神経細胞を模倣するものだけでなく、神経細胞でなく遺伝子を模倣するものや、生物の群れを模倣するものなどもあるそうです。

今回は機械学習がテーマなので、まずは機械学習の基礎から説明してくださいました。

ニューラルネットワークは、脳の神経細胞(ニューロン)を模したモデルで、ニューロンが、層を形成していて、同一階層ではつながっていないが、前と後の層とはすべてつながっているという特徴があり、「多層」で構成されるニューラルネットワークで行う学習をディープラーニングと呼ぶそうです。

f:id:itstaffing:20181219133723j:plain
▲ヒトの脳には1000億の神経細胞と100兆個のシナプスがあるそう

そして、ニューラルネットワークでは、入力に対して重み付けやバイアスをかけ出力をしますが、その結果に対して、ニューロンの結びつきの重要度を変えていく、バックプロパゲーションという考え方もポイントです。

f:id:itstaffing:20181219133726j:plain
▲バックプロパゲーションは、結果に基づいてニューロンの重み付けやバイアスを調整していくこと

人工知能と数学

人工知能の根本を理解するには数学が欠かせません。では、人工知能を知るのに必要な数学とは何でしょうか。我妻さんによれば、次のものだそうです。

[線形代数]ベクトル・行列・テンソルによる演算など
[微分]常微分・偏微分・連鎖など
[確率・統計]標準偏差・正規分布など

ディープラーニングは、Pythonと相性がいいと言われていますが、それはNumPyとmatplotlibいうライブラリが用意されており、上記の数学分野の演算が高速で処理できる関数群や、結果を手軽に可視化できるからだそうです。

「数学が何の役に立つのかわからなかった人も多いかもしれませんが、コードにすると手軽に試行錯誤が可能になります」とのことで、さっそく行列積をコード化してみることに。

f:id:itstaffing:20181219133729j:plain
▲PythonにライブラリNumPyを読み込んでいればこの行列積の計算も簡単に記述できる

123
456

という行列と、

11
11
11

という行列の積ならば次のようになります。

import numpy as np

a = np.array([{1,2,3},[4,5,6]})
b = np.array([[1,1],[1,1][1,1])

c = np.dot(a, b)
print(c)

行列の行と列の要素を入れ替える処理を転置と呼びます。

f:id:itstaffing:20181219133733j:plain
▲行列の要素数が増えると転置の処理も時間がかかるが……

NumPyを読み込んでおけば、次のように記述できます。

d = a,T
print(d)

ディープラーニングの実演

いよいよ実際にニューラルネットワークによる機械学習を実装します。とはいえ多層になると難しいので、ここでは単一ニューロンのモデルを使用しました。

f:id:itstaffing:20181219133737j:plain
▲単一のニューロンでも基本原理は変わらない。順伝播と逆伝播があり、逆伝播によりシナプスの結合が強化される
f:id:itstaffing:20181219133739j:plain
▲各ニューロンで入力に対して重み付けやバイアスをかけ、その結果を活性化関数で処理して出力を得る

内容はsin関数のx座標とy座標の値から、ニューロンにゼロから学習させていき、x座標の値からsin関数の結果導かれるy座標を予測させるというシンプルなものでした。

我妻さんがそれぞれの機能や役割を紹介しながら、実際にコード化していきます。3層で入力と出力が1つのニューロン、中間層のみ3つのニューロンというモデルです。

単純化すると入力値xに対して重みwを掛け、バイアスbを加える。これを活性化関数fに入力して出力値yを得ます。

u = xw + b
y = f(u)

活性化関数には、ニューラルネットワークに欠かせないもので、さまざまな関数が用いられますが、ここでは、古くから使われているシグモイド関数を使用します。

y = 1 / (1 + exp(-u))

実際には上記をベースに行列の演算を行っていきます。単一ニューロンによるニューラルネットワークであれば、主要な部分は3~4行で書けてしまうということに驚かされました。

Swiftによる深層強化学習

機械学習と言えばPythonを使うというイメージがありますが、他のプログラミング言語でも実装は可能です。実際に我妻さんが、Swiftでの実装を示してくれました。

内容は「強化学習」です。試行錯誤を通じて、ある環境においてエージェントが最も報酬が得られやすい行動をとるように学習していくもので、有名なものだとチェスやオセロの強化に利用されています。

強化学習に必要な概念には、行動、状態、報酬があります。行動は、エージェントが環境に働きかけること(たとえば迷路内を移動する)。状態はエージェントが環境におかれた状態(進める方向)。報酬は結果に与えられるもの(ゴールに到達すれば+1、罠にはまると-1のような)です。

これを実装する前に、この問題を解くための代表的なアルゴリズムであるQ学習について知っておきます。

f:id:itstaffing:20181219133742j:plain
▲各状態と行動の組み合わせにQ値を設定し、エージェントは最もQ値の高い行動を選択するようにし、Q-Tableの各値が最適化されることで学習を行う

Q値は、次の式に基づいて更新されます。

Q値の更新量=学習係数×(報酬+割引率×次の状態での最大のQ値-現在のQ値)

ただし、扱う状態の数が多いとQ-Tableが巨大になり学習がうまく進まなくなるという問題点があるため、Q-Tableの代わりにニューラルネットワークを使うのだそうです。これをDeep Q-Network(DQN)と呼びます。

f:id:itstaffing:20181219133745j:plain
▲DQNを使うことで状態の数が多い場合の学習もスムーズに進むようになる

そうして我妻さんがデモをしてくれたのが、Cart Pole問題という簡単なゲーム。これは、よく学校の掃除の時間に一度はしたであろう、箒を手のひらの上に立てて、バランスを取り、箒が倒れないようにするというあの遊びです。カートの上に乗せた棒を倒れないように左右に動かすというもので、棒が45度以上傾いたら報酬-1、200フレーム保てたら報酬+1としてSwiftで実装し、iPhoneで動作するものでした。

何回かデモをしてくださり、それを見ているだけでも面白かったのですが、我妻さんによれば、これまで何度も動かしてきた中で、さまざまな戦略が試みられていることが分かったということです。

たとえば「ぶるぶる移動作戦」は、小刻みに左右への動きを繰り返し、バランスを取るという手法、「カウンターアタック作成」は、まず大きくどちらか片方に動かし、すぐに逆に大きく動かすことでバランスを取ろうとする手法だそうで、他にもいくつも特徴的な学習の試みがなされているそうです。

今回のイベントでは、難しい数式も出てきましたが、機械学習の中身に踏み込んだものであり、考え方をコードに落とし込むというプログラミングの根源的な面白さもありました。数学とあわせて、よりディープラーニングへの理解を深めていきましょう。