Taste of Tech Topics

Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

ANGEL Dojo最終発表で「アライアンス賞」を受賞しました!

こんにちは!
2年目エンジニアの古賀です。

先日ブログで紹介したANGEL Dojoですが、 2020年3月6日、最終発表があり、AWSの審査員の方々が選ぶ「アライアンス賞」を受賞しました!
上位3チームに選ばれると貰える賞の1つで、 今回がんばってきたことが1つの形になって、とても嬉しいです。
アライアンス賞の詳細は後ほど^^

※ANGEL Dojo とは、AWS様主催の疑似プロジェクトを通して、 クラウド開発力とAmazonの文化を学び、ビジネスで日本を元気にしよう! という企画です。
 詳細は、以前のブログ(http://acro-engineer.hatenablog.com/entry/2020/02/21/170000)を是非読んでください。
acro-engineer.hatenablog.com

会議の"質"を向上させる HuNam

私たちのチームが何をつくっていたのかというと、会議の"質"を向上させるためのサービス「HuNam」です!
※HuNam(ヒューナム)という名前は社内公募で決まりました。Human Nature Meeting の略で、人間の本質、人間らしい、といった意味合いです。

日本中にあるとされるムダな会議を、生産的かつ心理的安全性の高い、会議の"質"が高い状態にしたい、という思いでこのサービスを作りました!

会議の参加者が、以下のようなHuNam画面を見ることで、自分の行動をその場で改善し、自律的に会議の"質"を向上させていくことができます。

f:id:acro-engineer:20200308144735p:plain:w400
HuNamの画面

最後まで楽しみながらやりきりました!

発表は、コロナウイルスの影響で、完全リモートで行われました。
リモートの分、どう発表したらインパクトが残せるか試行錯誤した結果、プレゼンをライブ中継しました。

少しトラブルもありましたが、プレゼン形式にしたぶん、プレゼンの臨場感や勢いをアピールできた気がします!

ちなみに、今回我々が作ったサービスは、会議を効率化するためのサービスなので、今後Web対応して、リモートでも使えるようにしたいですね^^

f:id:acro-engineer:20200308064158j:plain:w400
プレゼンの様子

f:id:acro-engineer:20200308064227j:plain:w400
配信風景

アライアンス賞とは?

最終発表を聞いた、AWSの審査員の方々が、以下の観点で選んでくださった賞です。

アライアンス賞
• Working Backwards に沿った企画ができているか
• ビジネス的に興味深い/価値がある内容か
• ソリューション全体の完成度

サービスのコンセプトや、技術面までを総合して選んでくださったようです。
特に今回は、「何をしたらお客様は嬉しいのか」というところを、一生懸命考えたので、そこをしっかり評価して頂き、本当にうれしいです!!

また上位3チームに選ばれたので、2020/3/25に開催される AWS Partner Summit Tokyo で発表するチャンスを頂きました。
頑張って作ったサービスを多くの人に見て頂ける場なので、最後までやり切り、より良いものにしたいです!

f:id:acro-engineer:20200308145817p:plain:w400
アライアンス賞を受賞

f:id:acro-engineer:20200308064345j:plain:w400
受賞を喜ぶAcro ANGEL チームのメンバー

Still Day One

今回のANGEL Dojoをきっかけに、お客様視点に立つことや、クラウド開発のイロハを学ぶことができ、とても貴重な経験でした。
企画してくださったAWS様、支えてくれた先輩方、本当にありがとうございました!

また何より、今回のANGEL Dojoに送り出してくれた社長・副社長に受賞の報告ができ、喜んでもらえたので、嬉しかったです。
最後まで応援してくださり、ありがとうございました!

最後に、今回のANGEL Dojoの企画者の方からお祝いのメッセージと共に頂いた、以下の言葉を紹介したいと思います。

'Still Day One'

Amazonの企業理念で、直訳すると「まだ1日目」。意味としては、「毎日が新しい挑戦の始まり」というところでしょうか。
いい言葉ですね。
よりよいエンジニアになれるよう、謙虚に、チャレンジしていきたいと思います!

技術的な詳細な内容は、また後日ブログにする予定なので、お楽しみに!


Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 

少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

Java/PythonでモダンなWeb開発をしたいエンジニアWanted! - Wantedlywww.wantedly.com



AWS主催「ANGEL Dojo」へのチャレンジ & 中間発表で1位になりました!!

皆さん、こんにちは!
最近機械学習エンジニアからDevOpsエンジニアにキャリアチェンジをしつつある渡邊(@move_fastest)です。
月日が流れるのが早く、昨年3月に入社して、早くも1年が経とうとしています。

実は昨年の年末からAWSジャパン様で企画された、「ANGEL Dojo」に会社の若手を代表して参加させて頂いています!
※ANGEL は APN((AWS Partner Network)Next Generation Engineer Leaders の略

2/14(金)に中間発表を終え、ANGEL Dojoも終盤に差し迫ってきたということで、これまで取り組んできたことを振り返ってみたいと思います!

クラウド開発で日本を元気にする ANGEL Dojo

AWS様公式のHPに「ANGEL Dojo」の定義が書いてあったので引用します。

ANGEL Dojoでは次世代を担うAPNの若手のエンジニアの方々に、擬似プロジェクトを通じてアジャイル、DevOps、モダンなアプリケーション開発などのクラウドネイティブな手法と、様々なInnovationを作ってきたAmazonの文化と考え方を体験いただくことで、お客様にクラウドの価値を100%届けるための基礎的なスキルを実践を通して身につけていただきます。参加者の皆様はここで培ったスキルと、各パートナーの皆様がお持ちのそれぞれの強みを活かすことでお客様のビジネスを成功に導き、日本のITや経済をさらに成長させる主役、すなわち「APN Next Generation Engineer Leader」になっていただきます。

要するに、AWS様主催の疑似プロジェクトを通して、クラウド開発力とAmazonの文化を学び、ビジネスで日本を元気にしよう! という企画です。
IT経験1-3年以内の人が対象で、3月初旬に最終発表があります!

ちなみに、ANGEL Dojoの企画が始まるきっかけとなったのは、ある日AWSのマネージャーの方が「日本を元気にしたい!」と言い出したのがきっかけだそうです。
「日本を元気にしたい!」と思うだけではなく、それを実際に企画してしまう行動力、そしてそれを許容する柔軟な組織文化が凄いなぁと思いつつ、感謝の気持ちでいっぱいです。

↓詳しくはこちらをご覧下さい↓
「日本を元気にする」APN Next Generation Engineer Leaders(ANGEL) Dojo のご紹介


知らないことだらけの疑似プロジェクト

サービスの企画から検討するのって楽しい、けど、難しい

年明け(1/6(月))からプロジェクトがスタートし、最初の2週間は企画のフェーズでした。
"Working Backwards"(逆向き解決法)と呼ばれる、Amazonが実際にサービス企画をする際に使用するフレームワークで、お客様を起点にサービスの企画を行い、それをもとにPR(プレスリリース)を作成しました。

一からサービスを企画するのは想像していたよりもずっと難しかったです。
気づくといつも「お客様が必要としているもの」ではなく、「自分達が作りたいもの」になってしまっていました笑。
そんなとき、「自分達が企画するサービスは、本当にお客様が求めているものなのか?」 この問いに何回も立ち返り、メンバ同士で議論することで、徐々に、お客様が求めているもの(課題)やそれを解決するサービスに対する理解が深まりました。

結果として、(多くの時間を費やしたお陰もあり、)サービス内容をブラッシュアップすることができたので、非常に合理的なフレームワークだと感じました。
何を作っているかというと、みなさんの会社でも(おそらく)非効率になりがちな会議を効率化するためのサービスです。詳細は今後のお楽しみに♪

f:id:acro-engineer:20200219022002p:plain:w400
サービス企画風景

良いサービスを開発したい!

1月終盤より、企画したサービスをもとに、アーキテクチャを考え、実装に入ります。
しかし、自分達で考えたアーキテクチャ、DBスキーマ、レポジトリがナンセンスで、何度もリファクタをする羽目に・・・
普段のプロジェクトでは上司が設計してくれている部分なので、改めて無駄がなく整理されたアーキテクチャを考えてくれている上司の偉大さが身に染みました。ありがたや・・・

本当は1月中にMVP(Minimum Viable Product)を社内リリースして運用してみたかったのですが、間に合わず断念。
その後も中間発表の準備に加え、セキュリティ観点での課題も見つかり、まだ社内リリースができていません。
早く社内にリリースして実際に使ってもらいたいです。

ということで、現在も機能の作成は続けています、正直トライ&エラーの繰り返しですが、より良いサービスを作りたいという思いが強いので、とても楽しい時間です!

f:id:acro-engineer:20200219023423p:plain:w400
もくもくと実装している風景

中間発表で1位に選んで頂きました!

最終発表は3月初旬ですが、2/14(金)に中間発表がありました!
発表は午後からだったのですが、発表で使用するデモ動画、発表資料の修正を当日のランチ頃まで行っており、かなりドタバタしてしまいました。

中間発表では、全15チームが揃って発表することもあり、そこで初めて他の参加企業が作ろうとしているサービスを知ることができました。
どの企業もWorking Backwardsでお客様が日頃感じる不満から逆算した、サービス内容だったので、聞いていて素直に、「このサービス欲しいなぁ」、「このサービスが実在したら、日頃困らなくなるなぁ」と納得させられるものがほとんどでした。

私達の発表では、実際に利用してもらうシーンを想定してもらうため、作成したサービスを使用したデモ動画を紹介しました。
苦労して作成したデモ動画が好評だったこともあり、ありがたいことに中間発表では参加者投票で1位を取ることができました。
ただ、どのチームのサービスも魅力的だったので、本番発表まで残すところ2週間弱、より良いサービスを作れるよう頑張ります!

f:id:acro-engineer:20200219025513j:plain:w400
アクロ発表者(古賀)

f:id:acro-engineer:20200219025655j:plain:w400
アクロ発表者(渡邊)
f:id:acro-engineer:20200219025728j:plain:w400
中間発表見事1位

周りの方々のサポートに感謝

このチャレンジをするにあたって、多くの方々のサポートがあります。
AWS様は、週2~3回の講義、ハンズオンなど多くの企画も実施して頂いており、とても勉強になっています。また、クラウド開発のアーキテクチャやお客様視点で考えるためのコツなど、アドバイスやレビューを何度も実施してもらっており、とても助かっています。本当にありがとうございます!

さらに、この企画は1チーム5人での参加が基本となっていますが、1社で5人というのはなかなか難しく「混合チームとして参加」という案で考えていた中、「どうせやるなら5人でやった方が良い」と送り出してくれた社長・副社長には感謝です!

このように、年始から始動し、色々な方のサポートの元開発を進めているサービスなので、世の中に役立つものとして今後公開できるようにしたいと考えています!
そして、最終発表では1位になって周りで支えてくれた人に恩返しがしたいので、最終発表の3/6(金)に向けて、ラストスパートをかけていきます!
(実は、上位のチームは AWS Partner Summit Tokyo で発表する機会を頂けるので、それもモチベーションになっています)

最終発表の結果もこのブログにて報告するつもりなので、みなさん、お楽しみに!!


Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 

少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

Java/PythonでモダンなWeb開発をしたいエンジニアWanted! - Wantedlywww.wantedly.com



Deep Java Library(DJL)を使ってみた

hayakawaです。
今回はJavaディープラーニングを実装できるOSSであるDeep Java Library(DJL)を使ってみました。

https://djl.ai/


ディープラーニングで何かをやるとしたら、現状ではPythonで開発するケースが多いですが、
システム全体としてはJavaで開発をしたいが、ディープラーニングの処理を利用したい場合、
これまでだと良いソリューションがなく、別サービスとしてAPI呼び出しをしたり、
JavaからPythonのプロセスを呼び出したりするようなことが必要でした。
ただこれだと、パフォーマンスが求められる場合、なかなか厳しいものがあります。

このOSSはそのようなケースで、Java上でのディープラーニング処理も実行できるようにすることを目指しているようです。

aws.amazon.com

Pythonで学習・モデル作成を行い、それをJavaで推論する、ということもできるようですが、
今回は、基本的な判定処理と学習処理を、Javaのサンプルコードから読み解いてみます。

判定処理

判定処理は、物体の種類と位置を検知する物体検知タスクのサンプルを見てみました。
プリトレーニングモデルを用いて、短いコードで判定を実現しています。

サンプル(ObjectDetetion.java)

    public static DetectedObjects predict() throws IOException, ModelException, TranslateException {
        Path imageFile = Paths.get("src/test/resources/dog_bike_car.jpg");
        BufferedImage img = BufferedImageUtils.fromFile(imageFile);

        Map<String, String> criteria = new ConcurrentHashMap<>();
        criteria.put("size", "512");
        criteria.put("backbone", "resnet50");
        criteria.put("flavor", "v1");
        criteria.put("dataset", "voc");

        try (ZooModel<BufferedImage, DetectedObjects> model =
                MxModelZoo.SSD.loadModel(criteria, new ProgressBar())) { //(1) 

            try (Predictor<BufferedImage, DetectedObjects> predictor = model.newPredictor()) { //(2)
                DetectedObjects detection = predictor.predict(img); //(3)
                saveBoundingBoxImage(img, detection);
                return detection;
            }
        }
    }
(1)モデルの読込み

モデルの読込みは

MxModelZoo.SSD.loadModel(criteria, new ProgressBar()))

というコードでやっています。

最初の MxModelZoo.SSD というところで、物体検知用のアルゴリズムであるSSDを指定し、
さらにSSDのバックボーンとなる画像判定モデルを何にするかを、
上のcriteriaというMapに詰めて指定して渡しています。
今回は"VOC"(PASCAL VOCのデータセット)で学習されたResNet50 v1のモデルを指定しています。

学習済みモデルは、名前の通りMXNet上の物がサポートされているようです。
AWSさんですし、MXNetになりますよね。

MxModelZooで指定できるモデルは以下のページに表で一覧されています。

djl/mxnet/mxnet-model-zoo at master · awslabs/djl · GitHub

表の各列の意味は次の通りです。

説明
Application 画像分類(Image Classification)やポーズ検知(Pose Estimation)などのタスクの種類。
Model Family SSDなどのモデルの分類名。この名前をMxModelZoo.~のところに指定します。
CriteriaとPossible values サンプルコードであったcriteriaに指定できる条件と値の組み合わせです。

今回やっている物体検知(Object Detection)は現在SSDのみをサポートしており、
バックボーンはVGGやMobileNetが使えるようです。

(2)判定器の生成
Predictor<BufferedImage, DetectedObjects> predictor = model.newPredictor()

で、新しい判定器を生成しています。

(3)画像の判定

メソッドの先頭の

Path imageFile = Paths.get("src/test/resources/dog_bike_car.jpg");
BufferedImage img = BufferedImageUtils.fromFile(imageFile);

で読み込んだ画像を、(2)で生成した判定器に

predictor.predict(img);

で渡し、さらに結果をsaveBoundingBoxImage()というprivateメソッドに渡して、
画像上に検知結果の名称と枠線を描画させています。

得られた画像が次のものです。

f:id:acro-engineer:20200214101006j:plain

リポジトリ内の djl/examples/src/test/resources/ ディレクトリに、
試し斬りに使える画像が置いてあるので、

Path imageFile = Paths.get("src/test/resources/dog_bike_car.jpg");

のところを書き換えて試してみましょう。

学習処理

学習の方は、伝統的なMNISTのサンプルがあったので試してみました。

サンプル(TrainMnist.java)

    public static ExampleTrainingResult runExample(String[] args)
            throws IOException, ParseException {
        Arguments arguments = Arguments.parseArgs(args);

        // Construct neural network
        Block block =
                new Mlp(
                        Mnist.IMAGE_HEIGHT * Mnist.IMAGE_WIDTH,
                        Mnist.NUM_CLASSES,
                        new int[] {128, 64}); //(1)

        try (Model model = Model.newInstance()) {
            model.setBlock(block); //(2)

            // get training and validation dataset
            RandomAccessDataset trainingSet = getDataset(Dataset.Usage.TRAIN, arguments);
            RandomAccessDataset validateSet = getDataset(Dataset.Usage.TEST, arguments); //(3)

            // setup training configuration
            DefaultTrainingConfig config = setupTrainingConfig(arguments); //(4)
            config.addTrainingListeners(
                    TrainingListener.Defaults.logging(
                            TrainMnist.class.getSimpleName(),
                            arguments.getBatchSize(),
                            (int) trainingSet.getNumIterations(),
                            (int) validateSet.getNumIterations(),
                            arguments.getOutputDir()));

            ExampleTrainingResult result;
            try (Trainer trainer = model.newTrainer(config)) { //(5)
                trainer.setMetrics(new Metrics());

                /*
                 * MNIST is 28x28 grayscale image and pre processed into 28 * 28 NDArray.
                 * 1st axis is batch axis, we can use 1 for initialization.
                 */
                Shape inputShape = new Shape(1, Mnist.IMAGE_HEIGHT * Mnist.IMAGE_WIDTH);

                // initialize trainer with proper input shape
                trainer.initialize(inputShape);

                TrainingUtils.fit( //(6)
                        trainer,
                        arguments.getEpoch(),
                        trainingSet,
                        validateSet,
                        arguments.getOutputDir(),
                        "mlp");

                result = new ExampleTrainingResult(trainer);
            }
            model.save(Paths.get(arguments.getOutputDir()), "mlp"); //(7)
            return result;
        }
    }
(1) レイヤ構造を定義

ニューラルネットワークのレイヤ構造を、MLPというクラスに生成させています。
MLPクラスのコードはこちらです。
お手軽に多層パーセプトロンを作ってくれるようです。中は次のようになっていました。

public Mlp(int width, int height) {
    add(Blocks.batchFlattenBlock(width * (long) height))
            .add(new Linear.Builder().setOutChannels(128).build())
            .add(Activation.reluBlock())
            .add(new Linear.Builder().setOutChannels(64).build())
            .add(Activation.reluBlock())
            .add(new Linear.Builder().setOutChannels(10).build());
}

width×heightの入力を受け取り、各層で128個、64個、10個の出力をする層を重ねたネットワークを構築しているようです。
層の内容を変えたければこのクラスでやっているようにadd()メソッドで積み重ねて作れます。

(2) モデルの生成

(1)のレイヤ定義を使って

try (Model model = Model.newInstance()) {
    model.setBlock(block);

で初期状態のモデルを生成しています。

(3) データの準備

getDataset()というprivateメソッドを呼び出して、MNIST用のデータを取得します。
Argument(プログラム引数)を渡しているのは、引数で指定したエポック数とバッチサイズに応じたデータ数を引っ張ってくるためのようです。

RandomAccessDataset trainingSet = getDataset(Dataset.Usage.TRAIN, arguments);
RandomAccessDataset validateSet = getDataset(Dataset.Usage.TEST, arguments);

getDataset()の内部では、 Mnist.builder() という組み込みのMNISTデータロード用クラスにデータを作らせていました。

(4) 学習の設定

setupTrainingConfig()というprivateメソッドの内部で、

return new DefaultTrainingConfig(Loss.softmaxCrossEntropyLoss())
        .addEvaluator(new Accuracy())
        .setBatchSize(arguments.getBatchSize())
        .optDevices(Device.getDevices(arguments.getMaxGpus()));

という処理で学習用の設定インスタンスを生成しています。
プログラム引数のバッチサイズや利用してよいGPU数などをセットし、Softmax関数、クロスエントロピー誤差を指定しています。

(5) 学習器の初期化

(4)で生成した環境設定で、学習器を生成しています。

Trainer trainer = model.newTrainer(config))
(6) 学習開始

学習器やデータを渡して、実際に学習を開始します。

TrainingUtils.fit(
        trainer,
        arguments.getEpoch(),
        trainingSet,
        validateSet,
        arguments.getOutputDir(),
        "mlp");
(7) モデルの保存

model.save()を呼ぶとファイルに学習済みモデルを保存できます。

model.save(Paths.get(arguments.getOutputDir()), "mlp");

感想

基本的な判定と学習を見てみましたが、APIの構成内容がオーソドックスで名前にクセも無いため、
他のディープラーニングフレームワークを知っていれば習得は速そうです。

またGPUは勝手に見つけて勝手に使ってくれるらしく楽です。

OpenCVなどを用いる画像処理ライブラリは、DJL側でラッパーを用意しており、
基本的な操作であれば独自にOpenCVを触らないでよさそうです。

上で紹介した以外のサンプルも同じディレクトリに配置されており、
基本的にはサンプルを真似して使えば一通りのことはできそうだと感じました。
Java上のディープラーニングライブラリとしては、良い候補になりそうです。

Acroquest Technologyでは、キャリア採用を行っています。


  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの求人 - Wantedlywww.wantedly.com

機械学習未経験者も良いモデルを作れるAutoGluonで「テキスト分類」をやってみた

こんにちは。@Ssk1029Takashiです。

最近、タスクを設定して、データセットを与えれば勝手にモデルまでいい感じにしてくれるAutoMLを使うための様々なサービス・ライブラリが出てきています。
先輩の@tereka114がAutoGluonを使っているのをみて触発されたので、私のほうではテキスト分類をやってみました。
acro-engineer.hatenablog.com

今回は、MXNetを使用したAutoMLライブラリであるAutoGluonを使って、テキスト分類を試してみます。

今回試した環境

python:3.7.6
OS:Ubuntu 18.04 LTS
ハード:GCP Compute Engine、メモリ 16GB、GPU NVIDIA Tesla K80

CUDA&AutoGluonのインストール

今回はGPU環境へのインストールを試していきます。
GPUを使うためので、CUDAのインストールが必須になります。

CUDA10.0のインストール

基本的には下記のGCPのページにそってインストールします。
cloud.google.com

最後のCUDAのインストールのコマンドを以下のように変更します。
(サイトの手順の場合、最新版がインストールされるのですが、今回使用するMXNetが10.0に対応しているのでこちらを合わせます。)

sudo apt install cuda-10-0

AutoGluonのインストール

下記のサイトにある通り、pip install2行でインストールできます。
導入が楽なのはありがたいですね。
autogluon.mxnet.io

pip install --upgrade mxnet-cu100
pip install autogluon

※現在はpython3.6と3.7、OSはLinuxのみの対応となっています。

AutoGluonでテキスト分類を行ってみる

それでは、チュートリアルにある通り、テキストの分類を試してみます。
今のところAutoGluonではStanford Sentiment Treebankデータセットでのベンチマークを試せます。

import autogluon as ag
from autogluon import TextClassification as task

dataset = task.Dataset(name='ToySST')
predictor = task.fit(dataset, epochs=3)

datasetを指定して、fitメソッドを呼び出すだけで、学習を始められます。
fitメソッドで指定しているepochsは学習方法を変化させるまでに実行するトレーニング回数になります。

学習を開始すると、以下のように自動でモデルがダウンロードされて学習を始めます。
f:id:acro-engineer:20200122004657p:plain

AutoGluonのTextClassificationでは、デフォルトの場合、 Gluonで使用できるBERTの英語pretrainedモデルを使用して学習を進めるようです。
そして、一つのモデルについて指定したepoch数の学習が完了すると、違うモデルで学習を始めて、より良いモデルを探索します。
f:id:acro-engineer:20200122013656p:plain

また、predictメソッドやevaluateメソッドから、学習した中で最も精度が良かったモデルを使って、推論・評価することが可能です。

test_acc = predictor.evaluate(dataset)
print('Top-1 test acc: %.3f' % test_acc)

結果は以下のように出力されます。

Top-1 test acc: 0.868

このデータセットの研究での精度は89%~97%程度となっています
nlpprogress.com
今回試した精度は86.8%でしたが、epoch数が3の学習で手軽にここまで迫れるの良い結果なのではないかと思います。

使ってみての感想

テキストに関しては、まだパラメータチューニングの対象・範囲の指定しかできませんが、カスタムデータセットへの対応がされると、適用できる範囲も広がるように思います。
また、現状では対応しているモデルも、BERTの英語モデルに限られているようですが、テキスト分類を簡単に高精度で実施できるのはうれしいので、これから拡張されていくことを期待しています!
(個人的には、日本語のpretrainedモデルに対応してくれると嬉しいです)

まとめ

今回はAutoGluonを使って、AutoML+テキスト分類を簡単に試しました。
インストールから使い始めまで、非常に容易にAutoMLを試すことができました。
これから機能が拡張されれば、より便利で手軽に機械学習を試せるようになりそうです。
引き続き今後の拡張を追っていきたいと思います。
それではまた。

Acroquest Technologyでは、キャリア採用を行っています。


  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの求人 - Wantedlywww.wantedly.com

機械学習未経験者も良いモデルを作れるAutoGluonで「テーブルデータの解析」をやってみた

こんにちは。
@tereka114です。

最近はCA x atma杯に参加するなどバタバタしておりましたが、少しずつ落ち着いてきました。
今回、AutoGluonと呼ばれるツールを使ってテーブルデータに挑戦してみました。

AutoGluonについて

AutoGluonは簡単に拡張、利用ができる自動機械学習のライブラリです。
前処理、ハイパーパラメータのチューニング、モデル選定、或いはアンサンブルといった機械学習モデリングを自動化できます。
これにより、機械学習に詳しくない人も簡単に精度が高いモデルの作成ができます。

autogluon.mxnet.io

AutoGluonはテーブルデータの分類・回帰、画像分類、文書分類、物体検出、そして、ニューラルネットワークアーキテクチャの自動構成を行うNAS(=Neural Architecture Search)に対応しています。
今回は、テーブルデータの分類を行うモデルを自動構築し、最適なモデルを提供します。

画像分類やテキスト分類と比較してテーブルデータの分類・回帰の自動化は難しいです。
テーブルデータは列に様々な情報が含まれるため、入力データごとに別々の特徴量変換手法を試す必要があります。
たとえば、温度や湿度のように数値で表現できるものは加工しなくとも数値のまま扱えます。
しかし、文字列であれば、その文字を数字に変換するなど工夫が必要になります。

これらの方法を知らなくても、AutoGluonが自動でその工夫を行ってくれるため、実装者はデータに対して何も加工することなく、機械学習モデルの作成ができます。

AutoGluonでテーブルデータの解析に挑戦する

今回、テーブルデータのサンプルには、機械学習チュートリアルで頻繁に利用されるTitanicのデータを利用します。
このデータセットを事前にKaggleのサイトに登録し、入手してください。

www.kaggle.com

1. データを読み込む

はじめに、学習用のデータを準備して、AutoGluonで利用できる形式にします。
autogluon.TabularPrediction.Datasetクラスを利用します。そのクラスの引数にファイルパスを入力し、インスタンスを初期化します。

import autogluon as ag
from autogluon import TabularPrediction as task

train_data = task.Dataset(file_path='train.csv')
2. 学習を行う

次に学習を行います。学習の実装は次の通りです。
autogluon.TabularPrediction.fitにより、あとは何も考えず、よしなに実行されます。

output_directory = "./outputs"
label_column = "Survived"
predictor = task.fit(train_data=train_data, label=label_column, output_directory=output_directory)

学習データとラベルと結果出力先のディレクトリを指定します。
それぞれ、デフォルトで決まっているモデルを利用し、構築します。
ディレクトリには、学習された結果のモデルが出力されています。

学習を開始するとログが次の通り、出力されます。
解析するデータセットの情報や使っている機械学習アルゴリズムとその評価結果、そして学習時間が出力されます。
単体のモデルだと、LightGBMの精度が最も高く、複数の機械学習アルゴリズムのアンサンブルでより精度が向上していることがわかります。

Loaded data from: train.csv | Columns = 12 / 12 | Rows = 891 -> 891
Warning: Specified num_trials == 1 or time_limits is too small for hyperparameter_tune, setting to False.
Beginning AutoGluon training ... Time limit = 10s
Preprocessing data ...
Here are the first 10 unique label values in your data:  [0 1]
AutoGluon infers your prediction problem is: binary  (because only two unique label-values observed)
If this is wrong, please specify `problem_type` argument in fit() instead (You may specify problem_type as one of: ['binary', 'multiclass', 'regression'])

Selected class <--> label mapping:  class 1 = True, class 0 = False
        Data preprocessing and feature engineering runtime = 0.33s ...
AutoGluon will gauge predictive performance using evaluation metric: accuracy
To change this, specify the eval_metric argument of fit()
Fitting model: RandomForestClassifierGini ... Training model for up to 9.67s of the 9.67s of remaining time.
        0.29s    = Training runtime
        0.8212   = Validation accuracy score
Fitting model: RandomForestClassifierEntr ... Training model for up to 9.19s of the 9.19s of remaining time.
        0.28s    = Training runtime
        0.8156   = Validation accuracy score
Fitting model: ExtraTreesClassifierGini ... Training model for up to 8.64s of the 8.64s of remaining time.
        0.27s    = Training runtime
        0.7933   = Validation accuracy score
Fitting model: ExtraTreesClassifierEntr ... Training model for up to 8.06s of the 8.06s of remaining time.
        0.27s    = Training runtime
        0.7821   = Validation accuracy score
Fitting model: KNeighborsClassifierUnif ... Training model for up to 7.61s of the 7.61s of remaining time.
        0.03s    = Training runtime
        0.6089   = Validation accuracy score
Fitting model: KNeighborsClassifierDist ... Training model for up to 7.48s of the 7.48s of remaining time.
        0.01s    = Training runtime
        0.6145   = Validation accuracy score
Fitting model: LightGBMClassifier ... Training model for up to 7.36s of the 7.36s of remaining time.
        0.28s    = Training runtime
        0.8268   = Validation accuracy score
Fitting model: CatboostClassifier ... Training model for up to 7.06s of the 7.06s of remaining time.
        0.66s    = Training runtime
        0.8156   = Validation accuracy score
Fitting model: NeuralNetClassifier ... Training model for up to 6.39s of the 6.39s of remaining time.
        3.54s    = Training runtime
        0.7933   = Validation accuracy score
Fitting model: LightGBMClassifierCustom ... Training model for up to 2.59s of the 2.59s of remaining time.
        0.4s     = Training runtime
        0.8268   = Validation accuracy score
Fitting model: weighted_ensemble_l1 ...
        0.36s    = Training runtime
        0.8492   = Validation accuracy score
AutoGluon training complete, total runtime = 9.52s ..

また、各モデルのハイパーパラメータをチューニングする場合には、hyperparameter_tuneの引数にTrueを与えます。
例えば、次のように設定できます。

predictor = task.fit(train_data=train_data, label=label_column, output_directory=output_directory, hyperparameter_tune=True, num_trials=10, time_limits=10)
3. 推論を行う

推論もごくわずかな実装で可能です。
学習した結果の機械学習モデルを利用して推論します。

test_data = task.Dataset(file_path='test.csv')
y_pred = predictor.predict(test_data)

使ってみての感想

良かったところ

機械学習そのものを知らない人でも簡単に記述できる

今回実施した通り、非常にシンプルに実装を書けます。
更には特に人間が設定しなくてはならないハイパーパラメータの設定を行っていません。
それぞれのモデルの知見が少なくともそれなりのスコアを出せることが良い点です。

ハイパーパラメータのチューニングも可能

fit関数は標準の引数だと、実行モデルの標準パラメータを網羅するのみとなっており、ハイパーパラメータの調整までは行いません。
しかし、ハイパーパラメータのチューニングの有無を指定でき、時間をかければ、より高い精度を出せます。
ハイパーパラメータの試行回数も設定ができるので、巨大なデータの場合は少ない回数を指定できるなど、設定の工夫が可能です。

制限時間がついている

一度の検証の制限時間を引数として与えられます。
そのため、偶然にも極端に長い検証時間がかかるハイパーパラメータを引き当ててしまった場合、通常だと終わるまで待つか、実行そのものをキャンセルするかになります。
この設定により、時間で打ち切り、すぐに次の試行に移れます。

ここがあるとより嬉しい

ドキュメントや例の整備

例題は非常にシンプルで使いやすいと思っていますが、カスタマイズする際にどうすればよいのかがあまり書かれていないと感じました。
ここに書いてあるかなーとメソッドのリファレンスを参照し、実行することで理解ができました。
機械学習をメインに取り組んでいる人であれば、直感と閃きで発見することが可能でしたが、なれていない人では難しいと思います。

最後に

AutoGluonですが、想像よりも柔軟に様々なパラメータを設定できてよいツールだと感じています。
ちょっとした実験や分析には十分利用できるライブラリだと思っています。
では、またお会いしましょう!

Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの求人 - Wantedlywww.wantedly.com

関東CV勉強会第56回で発表してきました

皆さんこんにちは。
お元気ですか。@tereka114です。
年始にお布団を家に購入して、冬でも想像以上に快適な眠りを迎えられています。

早速本題ですが、1/19(日)に関東CV勉強会第56回に参加し、発表してきました。

今回の勉強会のテーマは「コンピュータビジョンでこんなプログラム作りました大LT大会」です。

エッジデバイスとDeepLearningを組み合わせたもの・OpenCVのライブラリを使ったソフトウェア・自社製品等様々な発表がありました。
どの発表も創意工夫がされており、新しい発見も多く、非常に有意義でした。

今回はそのLTで「Mixed Precisionのすゝめ」のタイトルで発表しました。
Mixed Precisionはfloat32/16を利用して、計算精度を維持しつつも、メモリ消費量、性能の向上を実現する技術です。
それらはAutomatic Mixed Precision(AMP)と呼ばれるNVIDIA社提供のライブラリで簡単に使えます。

www.slideshare.net

発表内容の詳細は、スライドをご確認ください。
このAMPを自分のモデルをより良くする一つの選択肢として考えていただければ幸いです。

では、またどこかでお会いましょう。

Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの求人 - Wantedlywww.wantedly.com

2019年アドベントカレンダー振り返り

皆さんこんにちは
@tereka114です。

皆さん、今年もアドベントカレンダーが盛り上がりましたね。皆さんはどのアドベントカレンダーが良かったでしょうか?

Acroquestは、今年も有志がQiitaの各種アドベントカレンダーに参加し、執筆していました。
本記事ではアドベントカレンダーの投稿記事の一覧と注目度の高かった記事を紹介します。

おすすめ3記事

GiNZA+Elasticsearchで係り受け検索の第一歩

acro-engineer.hatenablog.com

検索といえば、キーワード検索や全文検索といった言葉が思い浮かぶ人が多いと思います。
しかし、症例検索の場合には、単語は含まれるが、検索としては絞りたいといったケースがあります。例えば、次の通りです。
「ずっと胃がキリキリと痛い。ただ、熱は無く平熱のままだ。」
「昨日からとても頭が痛い。おまけに胃がむかむかする。」

「胃が痛い」と検索したとき、通常の単語検索の場合だとどちらもヒットしますが、下の文章は意味としては異なる文章のためゴミになります。
この課題に対し、自然言語処理ライブラリGiNZAを利用して係り受けの情報を考慮した検索に挑戦しました。

私自身、検索だと、特に画像のベクトル検索の経験があります。
係り受けの情報を利用するのは自然言語ならではの取り組みで、アイデアが面白いと感じました。

Micrometerで取得したデータをKibanaで可視化してみました

acro-engineer.hatenablog.com

Spring Bootのアプリケーションの監視に使われるMicrometerを使ってKibanaで可視化しました。
これまでは、KibanaにMicrometerのメトリクスを監視するダッシュボードがなく、Prometeus&Grafanaが選ばれていました。
そのため、この記事では、ダッシュボードを作成し、可視化しました。

更にElastic Stackの一つであるElastic APMとも組み合わせたデモを作っています。
これにより、Spring Bootの状況をKibanaで一覧化できます。
そのため、性能のボトルネックとなる箇所やリクエストの処理情報が見えます。

当社のGithubに公開されているので、ぜひ使ってみてください。

1. Micrometer Kibana Dashboard
github.com

2. Micrometer & Elastic APM Demo
github.com

実務で使えるニューラルネットワークの最適化手法

acro-engineer.hatenablog.com

私が記載した記事になります。ニューラルネットワークの最適化手法(Adamなど)は毎年のように発表されています。
それらの最適化手法はどの手法を選ぶべきかに加えて、ハイパーパラメータチューニングをどうすべきかを検討する必要があります。
今まできちんと検証する機会もなかったので、これを機に、CIFAR10で検証を行いました。

最後に

2019年も終わりが近づいてきています。
今年のブログを振り返ってみると、特にElasticsearchや機械学習の記事が多い感じがします。
来年も引き続き、皆さんに良い情報を提供していきたいと思っています!

では、また来年もよろしくお願いします。

Acroquest Technologyでは、キャリア採用を行っています。


  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

モノリシックなアプリケーションをマイクロサービス化したいエンジニア募集! - Acroquest Technology株式会社のWeb エンジニアの求人 - Wantedlywww.wantedly.com