Spring Boot Gradle Pluginの環境下でタスク実行時のSpringプロファイルを引数で設定する

Gradle環境下でSpringBootでのプロファイルを動的に指定できないかと考えていた際に、引数で選択できると便利そうだったので色々調べてみた。

その結果、数行のコードで達成できることが判明したのでここに残す。

bootRunの場合

以下のように--args=の後に引数を書くだけで良い。

gradlew bootRun --args="--spring.profiles.active=hogehoge"

bootRunの実行時は、デフォルトで引数を渡す方法が存在するらしい。

自作タスクの場合

bootRunでは上手くいくのに自作タスクではできないという状況に悩まされ数時間無駄にしてしまった。

結局のところ、自作タスクの場合はjvmに引数を渡す処理を書かなければいけないようだ。

gradlew hoge --Pargs="-Dspring.profiles.active=hogehoge"

build.gradleには次のように記述する。

task hoge {
    if (project.hasProperty("args")) {
        println args
        jvmArgs args //-Dspring.profiles.active=hogehogeを渡している
    }
}

参考にしたページ

qiita.com

Gradle初心者のつまずきポイント

今回初めてGradleを触ったのだが、gradle.buildの仕様にいろいろ困らされたので、以下にメモ書きとして記載する。

初めてgradleを触った人なら、誰でも一度は詰まったであろうポイントを3つ紹介する。

変数の定義

変数の定義はdefでできる。

def a = 1
println a

defを書かない場合、ビルドエラー。

gradleとgradlewの違い

gradleでプロジェクトを生成すると、gradlewが生成されるがこちらは何者なのか。 プロジェクトの実行はgradleコマンドでできるため、不必要なのではないか。

以下のページに答えがあった。

gradleとgradlewの違い - Qiita

要するにgradleのプロジェクトを生成するとき以外は、gradlewを使えばいいという話。 gradlewはgradleがローカルにインストールされていない場合でも実行できる。 またPCの環境に関係なく、gradlew内で指定されたバージョンのgradleをベースにプロジェクトが実行される。

設定フェーズの存在

以下のようなbuild.gradleを作成する。

println("最初")

task foo {
    println("タスク: foo")
}

task bar {
    println("タスク: bar")
}

println("最後")

シェルでのgradle fooの実行結果は次のようになる。

gradle foo

//最初
//タスク: foo
//タスク: bar
//最後

通常のプログラミング言語を書く感覚では「タスク bar」は表示されないが、gradleの場合は表示されてしまう。

Gradle のタスク定義のあれこれ - Qiita

設定フェーズで実行される部分は、指定しているタスクにかかわらず常に実行される。 したがって、設定フェーズで実行される部分に間違ってタスクの処理を書いてしまうと、タスクを指定していないのに処理が実行されるという状態になってしまうので注意しなければならない。

とのことで、気をつけなければならない。

対処法として、doFirst, doLastのブロック内に書くと良い。

println("最初")

task foo {
    println("タスク: foo")
}

task bar {
    doFirst {
         println("タスク: bar1")
    }
    doLast {
        println("タスク: bar2")
    }
}

println("最後")

このような書き方をすると、println("タスク: bar1"), println("タスク: bar2")はfooタスクの実行時には表示されない。

G検定個人的メモ

背景

G検定を来週受けることにした。 基本的に落ちることはないだろうという舐めた考えを持ってはいるが、念の為公式本で一通り勉強しようと考えている。

昨年まで画像処理の研究室にいたため、 3, 4章は既にある知識で問題なく、5章は一般常識でどうにかなると考え、1, 2章だけ勉強ためのカンニングペーパーを作った。

追記(2021.08.05)

一昨日、G検定2021#2の結果が返ってきた。

  1. 人工知能とは.人工知能をめぐる動向.人工知能分野の問題:90%
  2. 機械学習の具体的手法:100%
  3. ディープラーニングの概要:100%
  4. ディープラーニングの手法:93%
  5. ディープラーニングの社会実装に向けて:87%
  6. 数理・統計:83%

機械学習の研究を少しでもやっていた人なら、特に難なく合格できると思う。

とはいえ、公式本の1, 2章の箇所の、機械学習の歴史や動向については少し目を通した方がいいかも。

メモ

1-1 人工知能とは

人工知能

1956年にアメリカでのダートマス会議でのジョンマッカーシー (edited) 人工知能の解釈は複数存在し、一意に定まらない

AI効果

AIに対してそれは単純な自動化であって人工知能ではない、と結論づける人間の心理的効果

人工知能とロボットの違い

物理的な身体は存在しない、考えることを中心に扱う

人工知能のレベル
  • レベル1: シンプルな制御 エアコンの温度調節など、振る舞いがあらかじめ決められているもの
  • レベル2: 古典的な人工知能 ロボット掃除機、診断プログラムなど探索・推論、知識データの活用で状況に応じて極めて複雑な振る舞いをするもの
  • レベル3: 機械学習 検索エンジン、交通渋滞予測など非常に多くのサンプルデータをもとに入力と出力の関係性を学習するもの
  • レベル4: ディープラーニング 画像認識、音声認識、自動翻訳など、特徴料と呼ばれる変数を自動的に学習するサービス

1-2 人工知能研究の歴史

エニアック

1946年アメリカのペンシルバニア大学、真空管を使った電算機

ダートマス会議

1956年にアメリカで開催、人工知能という言葉が初めて使われる

知的に行動したり、試行したりするコンピュータプログラムの実現可能性について議論

ロジック・セオリスト

世界初の人工知能プログラム、ニューウェルとサイモン

数学の定理を自動で証明

第一次AIブーム

推論・探索の時代(1950年代後半〜1960年台)

東西冷戦下でのアメリカでは英語-ロシア語の機械翻訳が注目されていた

トイプロブレムが解けても複雑な現実の問題が解けないことが明らかになった

第二次AIブーム

知識の時代(1980年台)

エキスパートシステム、と呼ばれる実用的なコンピューターがたくさん作られた

日本では第五世代コンピュータと名付けられた大型プロジェクトが推進された

知識を蓄積管理することの難しさが明らかになった

第三次AIブーム

機械学習・特徴表現学習の時代(2010年代〜)

機械学習が実用化された

ディープラーニング登場

シンギュラリティーに関する懸念が生まれた

2-1 探索・推論

STRIPS

Stanford Research Institute Problem Solver

前提条件、行動、結果の3つで記述する

SHRDLUしゅるどぅる

テリーウィラード、英語による指示を受け付けコンピューター画面に存在する様々な積み木の物体を動かすことができる

Cycプロジェクトに引き継がれていく

ヒューリスティックな知識

探索を効率化するのに有効な知識

不完全な情報でも探索や推論を有効に進められるようにする

Mini-Max法

自分が行動するときはスコアが最小に、相手が行動するときは(自分の)スコアが最小になるように行動する

αβ法

αカット:スコアが最小のものを選ぶ過程ですでに出現したスコアよりも大きいノードが現れた過程でその先につながるノードの探索を辞めてしまうこと

βカット:スコアが最大のものを選ぶ過程ですでに出現したスコアよりも小さいノードが現れた過程でその先につながるノードの探索を辞めてしまうこと

GPS将棋

670台のコンピューターを接続して1秒間に3億手を読む

モンテカルロ法

ゲームがある局面まで進んだら、あらかじめ決められた方法でゲームの局面を評価する、ということを放棄する

コンピューターが二人の仮想的なプレイヤーを立て、完全にランダムな手を差し続ける方法でゲームをシミュレーションする(プレイアウト)

ある局面からプレイアウトを複数回実行するとどの方法が一番勝率が高いかがわかる

2-2 知識表現

人工無能

チャットボット、おしゃべりぼっとと呼ばれる、特定のルール・手順に沿って会話を機械的に処理するだけ

会話の内容を理解していないから人工無能と呼ばれる

イライザ

相手の発言をあらかじめ用意されたパターンと比較しパターンに合致した発言があるとそのパターンに応じた発言を返答する

後の音声対話システムに影響を与えた

イライザ効果

あたかも本物の人間と対話しているような錯覚に陥ること

エキスパートシステム

専門分野の知識を取り込み、その分野のエキスパートのように振る舞うもの

マイシン

1970年代にスタンフォード大学で開発

血液中のバクテリアの診断支援を行う

500のルールがあらかじめ用意されており、順番に質問に答えていくと感染した細菌を特定しそれにあった抗生物質を処方することができる

69%で正しい解答、専門医は80%

DENDRAL

スタンフォード大学1960年代

未知の有機化合物を特定するエキスパートシステム

エドワード・ファインゲンバウムは1977年に知識工学を提唱

インタビューシステム

専門家から上手にヒアリングするシステム

ドキュメント、事例よりも専門家から知識を獲得することがとても難しかったから

知識ベースの保守の難しさ

たくさんデータを集めると、矛盾していたり一貫していないものがあるから

意味ネットワーク

概念をラベルがついたノードで表す

is-aの関係: 継承関係を表す。矢印が向いている側が上位概念(動物)、矢印の始点が下位概念(哺乳類)

part-ofの関係: 属性を表す(一部である)

Cycプロジェクト

全ての一般常識をコンピュータに取り込む

1984年スタート、30年たった今も続いている

パリはフランスの首都です、全ての木は植物です、みたいな文章を入力していく

オントロジー

知識を体系化する方法論のこと

元々は哲学用語で存在論のこと「概念化の明示的な使用」という言い方が広く受け入れられている(トム・グルーパー)

オントロジーの目的は知識の共有と活用

ヘビーウェイトオントロジー

構成要素や意味的関係の正当性について哲学的な考察が必要

ライトウェイトオントロジー

構成要素の分類関係の正当性について深い考察を行わない、ウェブマイニング、データマイニングでよく使用される

ワトソン

IBM、2011年にアメリカのクイズ番組に出演し、話題に

歴代のクイズチャンピオンに勝利した

Question-Answeringの研究分野の成果

ライトウェイトオントロジーを利用

シェフワトソン、と呼ばれる新しい料理のレシピを考える分野にも挑戦

ワトソンの仕組み

質問を分析して解答候補を複数選ぶ、質問との整合性や条件をそれぞれの回答候補がどの程度満たしているかを複数の観点でチェックし、総合点を出す

一番総合点が高いものを回答する

質問に含まれるキーワードと関連していそうな答えを高速に検索しているだけ

東ロボ君

2011年〜2016年

6月の進研模試で偏差値57.8をマーク

何かしらのブレイクスルーがないと東大合格が不可能であるという理由から2016年に開発が凍結

2-3 機械学習・深層学習

統計的自然言語処理

複数の語句や単語を一まとまりにした単位で用意された膨大な量の対訳データをもとに最も正解である確率が高い訳を選抜する

bankには銀行、土手という意味があるが近くにmoneyやinという単語が現れた場合に銀行であると確率が高いため、銀行という訳を選択する

パーセプトロンの性能と限界に関する論文

特定の条件かの単純パーセプトロンでは直線で分離できるような単純な問題しか解けない

誤差逆伝播法でこれを打開

2021年のILSVRC

ジェフェリー・ヒントン率いるSuperVisionが圧倒的勝利を収める

論文紹介: Video Representation Learning by Dense Predictive Coding(ICCV2019)

Info

Abstract

f:id:horipult:20200305163729p:plain
Figure 2

行動分類において、未来の状態を予測するタスクを解かせることで、良い特徴表現を獲得できる自己教師あり学習手法、Dense Predictive Coding(DPC)を提案。学習の際には、基準となるspatial , temporalともにpositiveな正解である特徴をtemporal negative, spatial negativeが混ざった特徴の中から選ばせるタスク(クラス分類)を解かせている。(Figure 2参照)UCF101、HMDB51において、自己教師あり学習についてSOTAを達成。

関連研究

  • Shuffle & Learn [27]
    フレームの時間的順番が正しいものと、シャッフルしたものを準備し、その並び順か正しいかどうかを2クラス判定。

  • OPN [22]
    フレームの順番をシャッフルしたものの並び順を回答する。

  • 3D-RotNet [15]
    映像を回転させたもの(0°, 90°, 180°, 270°)を用意し、その角度を推定。

  • 3D-ST-Puzzle [17]
    「フレームを4分割し並び替える」「時間的順番をシャッフルする」この2つの正解を同時に当てさせることによる自己教師あり学習

提案手法

Figure 2の通りであるが、以下の2つに注意。
1. 未来の状態を予測するが、直接的にフレームの画素を予測するわけではなく、中間表現を予測する
2. lossとして、正解値との距離を小さくするわけではない

loss関数として以下の式を最適化している。

f:id:horipult:20200305171847p:plain
 {z}は実際の特徴表現、 \hat{z}は予測により生成された特徴表現を表す。 {i}は時系列方向のindex、 {k}は空間方向のindexを表す。時間的、空間的に正しくない特徴の中から、正しい特徴を選び出すようなイメージである。これにより、未来の状態について複数の選択肢を考えることができる。単純に正解値との距離をlossとして定義してしまうと未来の状態が縛られたモデルを予測してしまうが、その選択肢を狭めないようにしている。

モデルがoptical flowのような表現を獲得し、未来の状態を予測することを防ぐために次の二つの工夫が行われている。
1. 次の状態だけではなくさらにその先の状態についても予測を行う
2. フレームごとにaugmentationを変える
optical flowとして機能してしまうとモデルが文脈を理解しないままに、未来を予測してしまうことが起こりうるためそれを避けたい。

実験結果

f:id:horipult:20200305174145p:plain
Table 1
5pred3は、5ブロックの情報を元に、3ブロックの状態を予測することを意味する。1ブロックは、10fpsでsamplingされた動画を5フレーム束ねたもの(0.5秒)。 時空間的に学習を行うことで精度が向上しているが、時間情報の影響の方が大きい。また、別な実験として、空間方向にaverage poolingした特徴により同様の学習を行ったが収束しなかったと述べられている。

f:id:horipult:20200305175038p:plain
Table 3
4pred4よりも5pred3の方が性能が良い。さらにその両方を組み合わせた場合の方が性能が上がる。これはデータの種類によって大きく変わる気がする。

f:id:horipult:20200305175233p:plain
Table 4
[15, 17. 22. 27]は関連研究の通り。Self-supervised learningでimagenet pretrainを上回ったのは初らしい。

展望

作者が述べているものはこの2つ

  • 時間情報を集約するために、ConvGRUではなく、attentionやMask CNNなんかを使用する
  • optical flow + DPCを同時に学習する

メモ

未来の状態を予測するというアイデアは応用がし易いように思える。時間的な継続性についての弱いlossをかけることができているので、self-supervised learning以外にも活用できるのでは?

論文紹介: 3D human pose estimation in video with temporal convolutions and semi-supervised training(CVPR2019)

Info

Abstract

f:id:horipult:20200223144325g:plain
Figure 1
動画から得られるような時間的な連続性がある2D poseから3D poseの復元を行う研究。LSTMを用いた従来手法と比べ、Figure 1のように時間方向にDilated Convolutionを用いることで精度を改善。ラベルデータのない動画も活用可能な、半教師あり学習の枠組みを提案。

関連研究

LSTMをSeq2Seq的に用いることで同様のことをしている。 f:id:horipult:20200223144958p:plain

提案手法

f:id:horipult:20200223144505p:plain
Figure 2

ネットワークの詳細はFigure 2の通り。畳み込みの際に、zero paddingを行わないことが少し特殊である。使うと精度が落ちるのだとか。

f:id:horipult:20200223145207p:plain
Figure 3
教師あり学習、半教師あり学習についての説明はFigure 3の通り。3D Poseの相対的な座標と骨盤のkey-pointを基準とした(間違っているかも)絶対的な座標を別々のモデルで学習している。

教師あり学習では、3D PoseとGlobal positionを推定し、それそれにMPJPE loss、WMPJPE lossを用いて学習を行う。

教師あり学習では、3D PoseとGlobal positionを推定するところまでは教師あり学習と同様だが、Global positionと3D poseを組み合わせて、Poseを2次元にProjectionする。そのProjection結果と元の2D poseに対して、MPJPE lossを計算することで学習を行う。

さらに、推測される3D Poseに制約をかけるために、bone length L2 lossを使用している。

MPJPE (mean per-joint position error)

全ての関節点ごとにL2ノルムを計算し平均を計算

WMPJPE (weighted mean per-joint position error)

$y_z$はdepth。MPJPEについて、距離が遠くなるほどlossが小さくなるような重みをかける。 f:id:horipult:20200223145818p:plain

bone length L2 loss

はじめに、ラベルありデータにおいてそれぞれの骨の長さを計算しておく。ラベルなしデータで3d keypointを推定する際に、ラベルありデータの骨の長さと、推定された3D Poseの骨の長さに対してL2 lossを与える。半教師あり学習では必須。

実験

評価指標

  • MPJPE(mean per-joint position error)
    • 全てのデータ、全ての関節点ごとにL2ノルムを計算し、平均をとる
  • P-MPJPE
    • translation, rotation, scaleについてGTを剛体変換したのちに、MOJOEの計算
  • N-MPJPE
    • scaleのみについてGTを変換したのちに、MPJPEの計算

データセット

Human3.6MとHumanEva-Iの二つ。

実験結果

f:id:horipult:20200223151504p:plain
Table 1
従来手法との比較はこちら。"*"はGTのbbox情報を活用しているもの、"†"は時系列情報を使用しているものである。

Walk、Walk Togetherなど動きが多い行動で大大きく結果が改善している。

f:id:horipult:20200223151916p:plain
Table 2
MPJPEとはmean per joint velocity errorのことで、関節それぞれの速度について評価を行ったものである。時系列情報を加味することで、速度の変化が大きく減らせており時間的な動きの滑らかさが改善している。

f:id:horipult:20200223152218p:plain
Table 5
LSTMを用いた従来手法、提案手法で入力のフレーム数を変えた場合の比較。LSTMと同じ計算量だが、提案手法の方が精度が高い。また、入力するフレーム数はある程度長い方が良いことがわかる。Human3.6Mでは50fpsなので、243フレームは約5秒。

f:id:horipult:20200223152535p:plain
Figure 6

教師あり学習の結果はこちら。教師データを減らした際には、教師あり学習よりも精度が多少上がっている。が、教師データが100%の教師あり学習と比べると、あまり良くない。

メモ

2D Pose >> 3D Pose推定に関して、時系列情報を加味する研究は出尽くした感。半教師あり学習については、Figure 6からわかるように、単純にラベル付きデータを増やせば精度が上がる状態であるので、ラベルなしデータを活用できるような手法についてはまだまだ検討の余地があるのかもしれない。

論文紹介: Cross-Modal Deep Variational Hand Pose Estimation(CVPR2018)

info

Abstract

様々なmodalのデータ(2D Hand Pose, RGB, Depth)から3D Hand Poseを推定する研究。複数のmodalityで一つの潜在空間を共有する状態でVAEの学習を行うことで、違うmodalityのデータから3D Hand Poseを生成できるようなモデルを獲得する。

提案手法

下の画像のまんま。

f:id:horipult:20200210223715p:plain
Figure 2

学習の枠組みはVAEと変わらないが、Encode前のmodalityとDecode後のmodalityが異なる。 (2D Hand Pose, RGB, Depth)のどれかをEncodeし、3D Hand PoseをDecodeしている。 そのため、VAEのlossであるKL-divergence + 再構成後の3D Hand Poseと教師データでのMean Squared Errorを損失関数としている。

VAEについては「Variational Autoencoder徹底解説」のページが非常に参考になる。VAEのLossの導出が非常にわかりやすく書かれている。

実験結果

f:id:horipult:20200210232310p:plain
Table 1
入力と出力を変化させて学習を行った際の結果。x_t>>x_tは3D Hand Poseから3D Hand Poseを再構成している。 複数のmodalityで潜在空間を共有しても精度はそんなに変化していない、むしろ上がっているものもある。

  • Var. 1: (x_i >> x_t )
  • Var. 2: (x_i >> x_t , x_t >> x_t )
  • Var. 3: (x_i >> x_t , x_i >> x_i )
  • Var. 4: (x_i >> x_t , x_i >> x_i , x_t >> x_t )

ただし、i: [RGB, 2D, Depth], t: [3D]

f:id:horipult:20200210225156p:plain
Figure 7

こちらは再構成結果の訂正的評価。青がGT。指が隠れてしまった際にズレが生じているように感じる。

メモ

イデア自体は非常にシンプル。

VAEベースであることから、教師情報がないデータも学習に活用できる点は良い。

「手」自体は基本的に素肌が見えているが、全身の姿勢推定をする際には服の影響があるため、RGBのmodalityをうまく捉えられない可能性があるかも。