機械学習のモデルは日々進化しており、言語モデルもその例の一つです。Webサービスとしてはかなり普及している印象ですが、モバイルアプリでの活用も考えるといくつか注意点があります。今回はその課題と対処法を考えていきます。
課題
Webと異なるモバイルアプリ独特の問題点には次のようなことが挙げられます。
- アプリのサイズ
- デバイスごとの処理能力の差
- セキュリティ
アプリのサイズ
機械学習の肝となるモデルはどうしてもデータサイズが大きくなってしまいます。もちろんモデル以外にもさまざまな機能をアプリ内に用意することを考えると負担の増加は避けられません。またこれらの事情はあくまでも知識のある私たちの目線であり、一般の人からすれば単に「やたらと容量を圧迫するアプリだな」という、使用をためらう原因になる恐れもあります。
処理能力の差
モバイル端末にはそれぞれ処理能力に差があります。使われる端末が最新機種なのか、それとも古いものなのかはわかりません。クラッシュや電池消耗はアプリの評価に影響を与えることが多く、ここは注意する点です。
セキュリティ
特にAppleに言えることですが、モバイルアプリにおけるセキュリティは厳しくなっていく傾向があります。アプリ内の通信は可視化され、ユーザーの許可が必要な機能は増えてきています。モデルのアップデートやフィードバックの仕組みもこれを考慮しておかなくてはなりません。
解決法
1.モデルを外部に置く
Webアプリのように外部で処理を行うことで先述の上2つの課題は解決します。現在リリースされている「AIと会話する」というようなアプリはこのタイプが多いように感じます。ただしセキュリティの問題が解決できません。単なる会話アプリなら問題ありませんが、本格的な文書を扱う場合は話が別です。有名なDeepL翻訳のように、扱うデータに対する安全性の保証も必要になってくるかと思います。
2.モデルを内蔵する
こちらはセキュリティの問題を解決できます。iOSではモバイル向けに最適化されたCore ML
を使うことでサイズや処理の負担もかなり軽くすることができます。言語処理ではさらにNaturalLanguage
というフレームワークも既に用意されています。
import NaturalLanguage
let text = "ホメロスは人工知能で文章を分析するアプリです"
func tokenize(text: String) {
let tokenizer = NLTokenizer(unit: .word)
tokenizer.string = text
let tokens = tokenizer.tokens(for: text.startIndex ..< text.endIndex)
var textTokens: [String] = []
for token in tokens {
let tokenStart = token.lowerBound
let tokenEnd = token.upperBound
let text = text[tokenStart ..< tokenEnd]
textTokens.append(String(text))
}
print(textTokens)
}
tokenize(text: text)
実行結果は以下のようになります。
["ホメロス", "は", "人工", "知能", "で", "文章", "を", "分析", "する", "アプリ", "です"]
もちろん最新の言語モデルに比べれば少々頼りないところもありますし、日本語に対しては十分機能しない機能もあります。ただトークン化は問題なく行うことが可能です。またiOS内のフレームワークであるためCore ML
以上に負担の少ない実装をすることができます。
まとめ
機械学習をモバイルアプリで使うには独自の工夫が必要になります。モデルを外部を外部に置くか内蔵するかは迷いどころですが、セキュリティ強化の風潮を見ると後者の方が安心です。サイズや処理の問題を解決する手段も提供されているから、という理由もあります。
実例
例と言いながら自分の開発したもので申し訳ないのですが、こちらの「ホメロス」は今回紹介したようにNaturalLanguage
フレームワークを使用したものです。機能としては以前の記事でも紹介しましたが、文章の文体や表現を分析してアドバイスを行うといったものです。
サイズは現状6.8MBとかなり抑えることができました。これならUIや機能をいくつか追加する余裕もあります。使い心地に関してはみなさんの判断に委ねたいと思うので、一度試していただけると嬉しいです。
さいごに
モデル自体の精度はもちろん、その応用法も日々進化しています。モバイルアプリのみならず、ぜひ機械学習をさまざまな場面で活用してみてください!