GENZITSU / UsefulMaterials

34 stars 0 forks source link

almost weekly useful materials - 02/22 - #127

Open GENZITSU opened 1 year ago

GENZITSU commented 1 year ago

ChatGPTで自然言語処理のData Augmentationやってみた。

ChatGPT(GPT-3.5)に対して元の文章と類似の文章作成してもらうことでData Augmentationを実施している記事。

ライブドアニュースコーパスに対してF値が0.844 → 0.857に上昇している。

なお、10時間かけても1500サンプルしか生成できず、お金もかかるので実用的では全くない(

コメント

試みとしては面白い。生成コストがもっと下がればわんちゃんありそう

出典

ChatGPTで自然言語処理のData Augmentationやってみた。

GENZITSU commented 1 year ago

pandasとpolarsとcudfの速度比較してみました。

テーブル操作系のライブラリ3者の速度比較をしている記事

結果をみるとGPUが使えればcudf、なければpolarsを使うのが良さそうという感じ。

いくつかのグラフ

スクリーンショット 2023-02-09 23 28 57

スクリーンショット 2023-02-09 23 29 08

コメント

polarsの速度がが段違いすぎてビビる笑

出典

pandasとpolarsとcudfの速度比較してみました。

GENZITSU commented 1 year ago

Deep Learning Tuning Playbook

Googleが公開した深層学習モデルのハイパラチューニングtips集

内容が多いので自分にとって新鮮なものだけ抜粋

コメント

出典

Deep Learning Tuning Playbook

GENZITSU commented 1 year ago

Codable Model Optimizer: 最適化問題を気軽に解くためのPythonフレームワーク

メタヒューリスティックに基づく最適化をPythonのみで実行できるライブラリの紹介

例えば以下のサンプルのように記述することで制約付き最適化を実行できる

# from https://github.com/recruit-tech/codable-model-optimizer

import numpy as np
from codableopt import *

# set problem
problem = Problem(is_max_problem=True)

# define variables
x = IntVariable(name='x', lower=np.double(0), upper=np.double(5))
y = DoubleVariable(name='y', lower=np.double(0.0), upper=None)
z = CategoryVariable(name='z', categories=['a', 'b', 'c'])

# define objective function
def objective_function(var_x, var_y, var_z, parameters):
    obj_value = parameters['coef_x'] * var_x + parameters['coef_y'] * var_y

    if var_z == 'a':
        obj_value += 10.0
    elif var_z == 'b':
        obj_value += 8.0
    else:
        # var_z == 'c'
        obj_value -= 3.0

    return obj_value

# set objective function and its arguments
problem += Objective(objective=objective_function,
                     args_map={'var_x': x,
                               'var_y': y,
                               'var_z': z,
                               'parameters': {'coef_x': -3.0, 'coef_y': 4.0}})

# define constraint
problem += 2 * x + 4 * y + 2 * (z == 'a') + 3 * (z == ('b', 'c')) <= 8
problem += 2 * x - y + 2 * (z == 'b') > 3

print(problem)

solver = OptSolver()

# generate optimization methods to be used within the solver
method = PenaltyAdjustmentMethod(steps=40000)

answer, is_feasible = solver.solve(problem, method)
print(f'answer:{answer}, answer_is_feasible:{is_feasible}')

コメント

目的関数から制約条件まで全てPythonでかけるのは嬉しい

出典

GENZITSU commented 1 year ago

大規模言語モデルを使って広告文を自動生成する

Yahoo! Japanで取り組まれている広告文自動生成における工夫点の紹介記事

以下気になったトピックを抜粋

モデルの再学習 大規模言語モデルではWikipediaなどのWebページで学習しており、そのまま使うだけでは広告らしくない文章が多数生成されます。

大規模言語モデルとはいえ、対象タスクのデータを食わせて際学習する必要がある

除外したいワードの対応

  • 生成後のワード含有判定による除外
  • 生成過程での除外
  • 固有表現抽出によるマスキング

2番目ではHuggingFace transformersに備わっている除外ワードの指定機能を利用します。この機能を利用すると生成過程において指定したワードをモデルが選択することを禁止し、指定ワードを含まない文章の生成が可能になります。

これについてはgenerateの関数の引数にbad_wordを指定することで実現できるもよう

# from https://huggingface.co/transformers/v3.3.1/_modules/transformers/generation_utils.html

    @torch.no_grad()
    def generate(
        self,
        input_ids: Optional[torch.LongTensor] = None,
        max_length: Optional[int] = None,
        min_length: Optional[int] = None,
        do_sample: Optional[bool] = None,
        early_stopping: Optional[bool] = None,
        num_beams: Optional[int] = None,
        temperature: Optional[float] = None,
        top_k: Optional[int] = None,
        top_p: Optional[float] = None,
        repetition_penalty: Optional[float] = None,
        bad_words_ids: Optional[Iterable[int]] = None,
        bos_token_id: Optional[int] = None,
        pad_token_id: Optional[int] = None,
        eos_token_id: Optional[int] = None,
        length_penalty: Optional[float] = None,
        no_repeat_ngram_size: Optional[int] = None,
        num_return_sequences: Optional[int] = None,
        attention_mask: Optional[torch.LongTensor] = None,
        decoder_start_token_id: Optional[int] = None,
        use_cache: Optional[bool] = None,
        **model_kwargs
    )

生成文書の多様性

  • 多様な文章を入力する
  • Decoding方法の選択

よく使われているdecoding方法として、beam search, top-k sampling, nucleus samplingがあります。また昨年Contrastive Search(※1)が新しく提案されております

コメント

huggingfaceで文章生成したことなかったので知らないことばかりだったが、デフォルトのインターフェースがだいぶ整っていることがわかった。

出典

大規模言語モデルを使って広告文を自動生成する

GENZITSU commented 1 year ago

Poetry の Dependency Group を利用したモノレポ Python 環境

Pythonでモノレポ環境を実現する際に懸念となる不要なライブラリ問題をdependency groupによる選択的なインストールによって解決した事例の紹介

鍵となるもののみ抜粋

dependency group

# from https://note.com/tatsuyashirakawa/n/nb3a6fb881e94

[tool.poetry.dependencies]
python = "3.8.16"

[tool.poetry.group.core]
optional = true
[tool.poetry.group.core.dependencies]
python-json-logger = "^2.0.4"
python-dotenv = "^0.21.1"

[tool.poetry.group.test]
optional = true
[tool.poetry.group.test.dependencies]
pytest = "^7.2.1"
pytest-cov = "^4.0.0"
pytest-mock = "^3.10.0"

[tool.poetry.group.lint]
optional = true
[tool.poetry.group.lint.dependencies]
pysen = "^0.10.3"

optional = true をつけることで以下のように選択的にライブラリをインストールすることが可能になる

poetry install --with core,test

pyproject.tomlのシンボリックリンク

poetry.lockはpyproject.tomlがあるところに作成されてしまうので、各プロジェクトのルートディレクトリにシンボリックリンクを貼ることでプロジェクト別にlockファイルを作成する

ln -s {リポジトリのルート}/pyproject.toml {プロジェクトのルート}

コメント

ちょうどモノレポを検討していたところだったので、とても参考になった

出典

Poetry の Dependency Group を利用したモノレポ Python 環境

GENZITSU commented 1 year ago

BERTを使って解釈性手法を試す 事例ベース編

2020年にGoogleから提案された、あるサンプルに対する予測の影響を、学習に利用したデータを用いて説明する手法、TracInを解説している記事

以下手法の肝

  • 通常の学習を行う途中、epochごとにチェックポイントとその時の学習率を保存する。
  • 訓練事例z、テスト事例z′について、それぞれのチェックポイントのモデルを用いて、損失関数の勾配を求めて式(3)を計算する。

スクリーンショット 2023-02-20 16 35 03

以下は公式実装のイメージ図

スクリーンショット 2023-02-20 16 37 49

コメント

モデルのデバックに利用できそう 記事ではBERTを使っているが、画像系のモデルやテーブル系のモデルにに利用してもよいはず

出典

GENZITSU commented 1 year ago

Kaggleに挑む深層学習プログラミングの極意

画像分類 / 画像検索 / 文章分類 の3つのタスクを元に実践的なテクニックを紹介している本

以下気になった項目だけメモ

数値データを順位関係に変換した後正規分布に変換するRankGauss

# from https://zenn.dev/colum2131/articles/fffac4654e7c7c

from sklearn.preprocessing import QuantileTransformer

scaler = QuantileTransformer(
    n_quantiles=100,
    random_state=42,
    output_distribution='normal'
)
scaler.fit(train[num_cols])
train[num_cols] = scaler.transform(train[num_cols])
test[num_cols] = scaler.transform(test[num_cols])

分位点を用いたロバストなスケーリング方法も存在する

# from https://zenn.dev/colum2131/articles/fffac4654e7c7c

from sklearn.preprocessing import RobustScaler

scaler = RobustScaler(quantile_range=(25.0, 75.0))
scaler.fit(train[num_cols])
train[num_cols] = scaler.transform(train[num_cols])
test[num_cols] = scaler.transform(test[num_cols])

mAP@kの定義

下のような定義。ただしrは正解の数 と 拾ってくる数の小さい方の値を取る
OOOxxのような場合はxxの外れがカウントされず1になるのがポイント

スクリーンショット 2023-02-23 20 51 47

Arcfaceのハイパラ調整

DELG特徴量

大域特徴量と局所特徴量をDeepLearningベースで取得する手法

最近だとLoFTERもやりそう

DEGENSAC

特徴点のマッチングをする際によく持ちられるRANSACの改良版、実行時間とマッチング性能のバランスが良いらしい

重み付きJaccard係数 / Dice係数

単語の重複度を計算する際に、レアな単語の重みを増やせるようにするためにTF-IDF重みをかけたりする

WordMoversDistance

gensimを用いると簡単に計算が可能

グラフ構造を用いた特徴量

質問と質問の対からグラフを作成して、次数などが計算可能

計算量削減のためのDynamic Padding

# from https://github.com/smly/kaggle-book-gokui/blob/main/chapter5/experiments/204_bert_concat_last4cls.py#L192
        collator_fn = DataCollatorWithPadding(
            tokenizer=tokenizer, padding="longest", max_length=max_length
        )
        tst_loader = DataLoader(
            tst_dataset,
            config["batch_size"],
            num_workers=num_workers,
            collate_fn=collator_fn,
        )

LengthGroupedSamplerを用いて文字数の近いものをまとめることも可能

コメント

実用的なテクニック満載でとても勉強になる

出典

GENZITSU commented 1 year ago

Transformerに自分の好みのDLsite音声作品を学習させて、癖に刺さる新作を毎日通知するシステムを作った話

DLsiteの新作をクローリングして自分の好みかどうかをlambdaで分類し、slackへ通知するシステムの作成方法を紹介している記事

システム構成

スクリーンショット 2023-02-21 22 50 47

クローラーについて

AWS SAMを用いてクローリングするLambdaを作成

template.ymlの中でスケジューリングの方法や利用するDockerfile、ランライムなどを指定することが可能

# from https://qiita.com/oddgai/items/67da0321635e902b10f8

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      PackageType: Image
      Architectures:
        - x86_64
      Policies:  # S3への書き込み権限をつける
        - S3WritePolicy:
            BucketName: !Ref S3BucketName
      Events:
        HelloWorld:
          Type: Schedule  # スケジューラーを設定
          Properties:
            Schedule: rate(1 day)  # 1日おきに実行する
    Metadata:
      Dockerfile: Dockerfile
      DockerContext: ./hello_world
      DockerTag: python3.9-v1

推論API

こちらもモデルを学習してSAMを用いてLambdaをデプロイしている

API GatewayではなくLambda Function URLを使うように設定することでエンドポイントを直叩きできるようにしているのがポイントか

slackからのFBの制御

ここが一番すごい

slackへの通知の際にメッセージにボタンを配置し、押されたボタンによって教師データの更新を行えるようにしている。

色々込み入っているのでもと記事を見ることを推奨

コメント

AWS SAMをうまく使うことで、これほどまでの機能を簡単に作成できるのはめっちゃすごい...

出典