Monthly Archives: 7月 2017

2017-07-19

二ヶ月間の新卒エンジニア研修で成長できた事

はじめまして。

17新卒としてGMOアドパートナーズに入社したY.Oと申します。

本記事では、5月から6月に掛けて行われた社内研修テックイノベーション基礎研修と、6月から始まったOJT研修で学んだ内容に関して紹介させて頂きます。

この二ヶ月間の研修スケジュールですが、下記の内容で進行していきました。

  • テックイノベーション研修(5月)
    • 開発技術研修
      • Linux基礎学習(自習)
      • Ruby
      • Ruby on Rails
    • アドテクノロジー講義
      • 各プロジェクトの紹介
      • まとめレポート作成(自習)
  • OJT研修(6月)
  • GMOテクノロジーブートキャンプ(毎週金曜日)

それぞれの研修内容に関して紹介させて頂きます。


テックイノベーション – 開発言語学習 –

Linux基礎学習

Linuxのシステム構築・運用知識に関する資格であるLPIC、中でも基礎的な内容を取り扱うレベル1試験の年内合格を目標に、リナックスアカデミー著『Linux教科書 LPICレベル1』(Linux技術者認定試験学習書)という参考書を用いて、Linuxの基礎を学びました。

LPICレベル1は101試験と102試験の2つに別れており、双方の試験を合格する事で初めて資格が取れる仕組みになっています。
研修中では101試験の合格を目標に、自習時間を利用して対策を行いました、主な内容は以下の通りです。

  • システムアーキテクチャ
  • Linuxのインストールとパッケージ管理
  • GNU&UNIXコマンド
  • ファイルとプロセス管理
  • デバイスとLinuxファイルシステム

学生の頃には全く触れていなかったネットワーク系の知識が問われる内容となっており、非常に勉強になりました。
本記事執筆時点で101模擬試験の正答率は7割程度。7月中の101試験合格を目指して引き続き勉強を行っていきたいと思います。

Ruby講義

本配属後はRubyを用いて業務を行うため、Rubyサポーターズ著『パーフェクトRuby』(技術評論社)という参考書を用いたRubyの講義を受けさせて頂きました。

研修は基本的に講義形式で参考書を用いた説明をして頂いた後に、学んだ内容を利用して課題を解いていくといった形式で進んでいきました。

条件分岐/例外処理/ハッシュ/クラス/ブロック/MySQLとの接続…などなど、様々な内容を教わった後、最終課題として「MySQLから受け取ったデータを元にSlackにレポートを出力する」といった課題を行いました。

今までは、”分からない部分があった時に参考書を利用する”といったスタンスで勉強していたため知識が虫食い状態だったのですが、今回の講義を通して一から順に参考書通り勉強する事で、今まで抜けていた知識を埋めることが出来たと思います。

Ruby On Rails講義

配属後、TAXELの管理画面を編集する際にも使用するRuby on Railsの講義を受けました。

この講義はすがわら まさのり 著『パーフェクトRuby on Rails』(技術評論社)の5章までの内容を講義形式で順に学んだ後に、6章の課題であるイベント告知アプリケーションを成果物として作成する、といった内容でした。

Railsはインターンシップ中にも扱いましたが、自動的にファイルの関連付け等を行ってくれるため、詳しい仕組みを知らなくても簡単にWebアプリケーションを作る事が出来ました。その一方で、なぜこれで動くのか、といった疑問も多く存在し、理屈が分からないままでに使ってしまう場面も多々ありました。

今回の講義を通してオートローディングの仕組みやMVCの関わりといったRailsの基礎を学ぶことで、今までと比べて理解した上で使える状態になれたと思います。


テックイノベーション -アドテクノロジー講義 –

アドテクノロジーへの理解向上を目的として、HR研修(アドパートナーズグループ全体の研修)で学んだ内容も含めて「APグループのアドテク事業取組み」についてのレポートを作成するといった課題に取り組ませていただきました。

レポートを作成するにあたって、各プロダクトを理解する為にプロダクトの講義を受ける時間を設けて頂きました。
講義の中では自社プロダクトであるTAXEL/AkaNe/GMO SSP/GMO MARSといった様々なプロジェクトを先輩方から、実際の管理画面などを見せて頂きながら、プロダクトの内容や仕組みを丁寧に教えて頂きました。

講義の内容をレポートという形式にアウトプットする作業を通して、アドテクノロジーの概要や、自身が関わるプロダクトがどのように社会と関わっているのかという点を学ぶことが出来ましたが、複雑なアドテクノロジーの世界に関して、まだまだ理解出来ていない箇所も多いので、引き続き学び続けていこうと思います。


OJT研修

6月からはOJT研修として、TAXELの管理画面の開発に携わりました。
研修中の身ではありますが、ありがたい事に新機能の開発や可読性の向上といったお客様の目に触れる変更にも関わらせて頂く事が出来ました。
仕事の内容を聞いた当初はスムーズに開発が進むと思いましたが、実際に開発を行ってみると、様々な問題に直面しました。
しかし、先輩方の力を借りながら、徐々に改善を重ねる事で、自身の技術向上に繋げる事が出来たように感じます。
直面した問題と、それを解決することによって得られた技術・知識は以下の通りです。

Railsの思想に沿った設計が出来ない => Railsの思想の理解

OJT研修が始まるまでは、共同で開発する経験が殆ど無く、動きはするものの読み辛い/規約に反しているコードを書いてしまう事が多々あり、研修で書いたコードをレビューしていただく中でも、指摘されてしまう事が何度かありました。
その対策として参考書を何度か読み直しながら、レビューで指摘された点と比較し、どこが正しく、どこが正しく無いのかを一つ一つ確認していく事で、改善していく事が出来ました。
Rails研修を通して、今まで曖昧にしか理解出来ていなかったRailsの基礎を、一通り学ぶことが出来たように思います。

技術力不足 => 問題解決能力の向上

開発の中ではRails/Ruby/Javascript/jQuery/CSS/MySQL/HTMLといった様々な言語を扱わせて頂きましたが、まだまだ技術力が不足しており、知っていれば1分掛からない変更に1時間掛かってしまう事も多々ありました。
しかし問題を対処する中で、自分の力で調べ分からなかった点は質問し、得た知識を自分の基礎能力の向上に繋げる事で、全体的な問題解決能力が上昇したように感じています。

開発フローの不理解 => 開発フローの理解

集団開発の経験が少なかった為、仕様書設計やテストをどのような手順で進めれば良いのかが分からず、開発作業以外の作業で業務が滞ってしまう事が多々ありました。
しかし、順を追って先輩に教えて頂いた事で、二つ目のタスクを進める際は、殆ど質問せずに進めることが出来ました。
仕様書設計 => 開発  => 単体テスト考案  => 単体テスト実施 =>リリース手順書記述 といった、基本的な開発フローを学ぶことが出来たのは、OJT研修の中でも特に大きな成長だと感じています。

このように、OJT研修では様々な問題に直面しながらも、自分なりに対処することで成長へと繋げる事が出来ました。
まだまだ至らない点も多く、先輩方に助けられる毎日ではありますが、今後も問題を乗り越え成長して行きたいと思います。


GMOテクノロジーブートキャンプ

5月の半ばから7月の末までの毎週金曜日、GMOテクノロジーブートキャンプ(以下 GTB)に参加させて頂いています。
GTBは”No.1サービスを生み出している現役エンジニア”から”GMOインターネットグループならではの幅広い技術”をインプットした上で、”開発合宿を通してアウトプットまで行える”という、至れり尽くせりの研修プログラムです。

GTBで学ぶことが出来る技術の一部としては…

  • IoT
  • ITの歴史
  • DNS
  • ネットワーク
  • Linux
  • PHP
  • 仮想化
  • セキュリティ
  • デザイン思考
  • etc…

などなど、ここでは書ききれない程の多くの技術・知識を学ぶことが出来ます。

この記事を書いている時点で特に私の印象に残っているのは、「Pepper開発ワークショップ」です。
8人程度の班で4時間程の時間でPepperを使った成果物を作成・発表し得票数を競う、といったワークで、私達の班は、Pepperと会話をしながらジャンケンやあっち向いてホイで遊ぶプログラムを実装しました。
既知の言語で書くのであれば簡単な内容ですが、ほぼ全員がPepper開発が初めてという状況であった為、完成したのは時間ギリギリとなってしまいました。

しかし、最終的には見事得票数1位を獲得し、優勝する事が出来ました。短い時間の中で、チームメンバーとコミュニケーションを取り案を出し合いながらゼロから一つの成果物を協力して作り上げる、というチーム開発の醍醐味を濃縮したようなワークを体験することで、開発の楽しさをより深く知ることができました。


まとめ

約二ヶ月間のエンジニア研修を通し、「テックイノベーション研修」「OJT研修」「GMOテクノロジーブートキャンプ」の3つの研修プログラムを体験させて頂きました。
テックイノベーション研修からはスムーズに業務に入るための基礎技術を、OJT研修では実際の業務で直面する問題への対応能力をGMOテクノロジーブートキャンプでは多岐多様に渡る技術の知識とチーム作業の楽しさを、それぞれ学ばせて頂き、研修を受ける前に比べて大きく成長する事が出来ました。

研修は終わりましたが、7月からの本配属から本当のスタートとなりますので、エンジニア研修の経験を活かし、今後も気を引き締めて業務に取り組んで行きたいと思います。

 

【参考】
GMOの新卒技術研修2017 中間速報(GMOインターネット 次世代システム研究室)

2017-07-03

機械学習(ディープラーニング)で使われる基本的な用語について理解しよう

こんにちは、GMOアドマーケティングのMHです。

現在、GMOアドマーケティングでは機械学習の勉強会を行っています。
ゼロから作るDeep Learningをみんなで輪読をしているのですが、出来るだけ数式を使わないでコードで説明しようとしてくれているため、非常に分かりやすいです。

ただ、それでも章を進むに連れて、前提となってくる用語などが増えてきますので、「あれこの用語なんだっけ?」となることがしばしばありました。
これからゼロから作るDeep Learningを読む人が同じようなことにならないように本書に出てくる必須と思われる用語についてまとめてみました。


活性化関数

総入力を入力として、出力が切り替わる関数のことを指します
パーセプトロンではステップ関数が使われ、ニューラルネットワークではシグモイド関数/ReLU(ランプ関数)がよく使われます。

ステップ関数

閾値を境に出力が切り替わる関数のことです。
そのため、ステップ関数は一定値を超えると急に値が切り替わる様な動きをします。

例えば、xが0以下だと0となり、0より大きいと1となるような関数です。

シグモイド関数

以下の数式で表される関数のことです。
1/(1+exp(-x))

シグモイド関数はステップ関数とは違い、数字が入力値によって連続して変化していき、緩やかな逆S字の出力となります。

ニューラルネットワークやディープラーニングでは以下の理由により、よく使われます。

  • 必ず傾きが求まる(必ず微分可能)
  • 出力が0−1に収まる
  • 誤差逆伝播法で微分する際の計算コストが軽い

ReLU関数(ランプ関数)

入力が0以下なら0、0以上ならそのまま出力する関数のことです。
以下の数式で表せます。
h(x) = {x(x>0),0(x<=0)}

誤差逆伝播法を使用した際の逆伝播時の動作としては、以下のようになります。

  • 0以下なら伝播をストップ(0を流す)
  • 0以上ならそのまま流す

ニューラルネットワークにおける活性化関数

ニューラルネットワークは簡単に表すと以下の構成になっています。

入力層から隠れ層などの次の層に遷移得する際に活性化関数を通して値を変化させていきます。

ニューラルネットワークでの活性化関数には線形関数は使わず、非線形関数である必要があります。
線形関数では、入力が単に等倍されるだけとなってしまい、ニューラルネットワークの隠れ層を増やす意味が無いからです。

出力層は最終的に出てきた値を求める値かどうかを判定や分類するための層となります。
そのため、出力層に遷移する際にはそれまでとは別の活性化関数を利用します。

出力層で利用される活性化関数

恒等関数

出力をそのまま利用します。
回帰問題で利用されます。

ソフトマックス関数

出力結果の総和を自分自身の値で割ります。つまり、出力結果に対する割合を表します。
分類問題で利用されます。


損失関数

活性化関数を利用して、出た結果を元に重みを増減するときに利用する関数です。
重みの増減は微分を用いてどの程度移動するかを算出します。

なぜ、活性化関数そのままではなく、損失関数を通して調整をするのかというと、活性化関数の値そのままでは、振れ幅が大きすぎてしまい、パラメータの調整が難しいためです。
損失関数を通すことによって、パラメータの微妙な動きに出力を連動させ、出力の値を連続的な数値に均す事ができます。

損失関数の種類

2乗和誤差

全部の正解データと出力データとの差を2乗します。
そのため、必ず正の値になります。

Pythonでの実装例としては以下となります。

交差エントロピー誤差

正解ラベルに対する出力の自然対数とします。

Pythonでの実装例としては以下となります。

ソースコード上にてdeltaを足しているのはyが0の場合、log(0)=マイナスの無限大での計算が発生してしまい、計算を進めることが出来なくなってしまうためです。


勾配法(勾配降下法)

勾配法には以下の2種類があります。

  • 最小値を求めるのが勾配降下法
  • 最大値を求めるのが勾配上昇法

機械学習では基本的には、損失関数を最小化するように重みを更新するため勾配降下法が利用されます。
重みの更新は、入力〜出力→損失関数の一連の数式に対して、微分を行い、重み移動を少しずつ繰り返すことで、損失関数を最小化させていきます。


ミニバッチ

訓練データの中からランダムにデータを抜き出して学習をさせることをミニバッチといいます。
ミニバッチを利用するということは、一部のデータを全体の近似として利用することになります。

ミニバッチにおける損失関数の計算について

損失関数の計算は抜き出した訓練データ1つ1つに対して求める必要はなく、
最終的な損失の値を訓練データの数で割ることで平均の損失値を求める形になります。
なぜなら、最終的な目的は、全ての訓練データで、損失の値を0にすることのため、全体として損失最小化をすれば良いため、平均を求める形となります。


誤差逆伝播法

勾配法によって重みを更新するには勾配を求める必要がありますが、数値微分で求めてしまうと非常に多くの時間がかかってしまいます。
そのため、解析的に数式を説いて求める方法として、誤差逆伝播法を利用します。

数値微分が全く使われないかというとそうではなく、数値微分の利点としては実装の簡単さがあげられます。
そのため、誤差逆伝播法の結果確認として数値微分を利用する事に利用されます。


如何でしたでしょうか。
今回はゼロから作るDeep Learningに出てくる基本的な用語について纏めました。
機械学習に興味がある方は、本記事を片手に是非、ゼロから作るDeep Learningを読んでみてください。