Open GENZITSU opened 1 year ago
テーブル操作系のライブラリ3者の速度比較をしている記事
結果をみるとGPUが使えればcudf、なければpolarsを使うのが良さそうという感じ。
いくつかのグラフ
polarsの速度がが段違いすぎてビビる笑
メタヒューリスティックに基づく最適化を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でかけるのは嬉しい
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で文章生成したことなかったので知らないことばかりだったが、デフォルトのインターフェースがだいぶ整っていることがわかった。
Pythonでモノレポ環境を実現する際に懸念となる不要なライブラリ問題を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
poetry.lockはpyproject.tomlがあるところに作成されてしまうので、各プロジェクトのルートディレクトリにシンボリックリンクを貼ることでプロジェクト別にlockファイルを作成する
ln -s {リポジトリのルート}/pyproject.toml {プロジェクトのルート}
ちょうどモノレポを検討していたところだったので、とても参考になった
2020年にGoogleから提案された、あるサンプルに対する予測の影響を、学習に利用したデータを用いて説明する手法、TracInを解説している記事
以下手法の肝
- 通常の学習を行う途中、epochごとにチェックポイントとその時の学習率を保存する。
- 訓練事例z、テスト事例z′について、それぞれのチェックポイントのモデルを用いて、損失関数の勾配を求めて式(3)を計算する。
以下は公式実装のイメージ図
モデルのデバックに利用できそう 記事ではBERTを使っているが、画像系のモデルやテーブル系のモデルにに利用してもよいはず
画像分類 / 画像検索 / 文章分類 の3つのタスクを元に実践的なテクニックを紹介している本
以下気になった項目だけメモ
# 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])
下のような定義。ただしrは正解の数 と 拾ってくる数の小さい方の値を取る
OOOxxのような場合はxxの外れがカウントされず1になるのがポイント
大域特徴量と局所特徴量をDeepLearningベースで取得する手法
最近だとLoFTERもやりそう
特徴点のマッチングをする際によく持ちられるRANSACの改良版、実行時間とマッチング性能のバランスが良いらしい
単語の重複度を計算する際に、レアな単語の重みを増やせるようにするためにTF-IDF重みをかけたりする
gensimを用いると簡単に計算が可能
質問と質問の対からグラフを作成して、次数などが計算可能
# 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を用いて文字数の近いものをまとめることも可能
実用的なテクニック満載でとても勉強になる
DLsiteの新作をクローリングして自分の好みかどうかをlambdaで分類し、slackへ通知するシステムの作成方法を紹介している記事
システム構成
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
こちらもモデルを学習してSAMを用いてLambdaをデプロイしている
API GatewayではなくLambda Function URLを使うように設定することでエンドポイントを直叩きできるようにしているのがポイントか
ここが一番すごい
slackへの通知の際にメッセージにボタンを配置し、押されたボタンによって教師データの更新を行えるようにしている。
色々込み入っているのでもと記事を見ることを推奨
AWS SAMをうまく使うことで、これほどまでの機能を簡単に作成できるのはめっちゃすごい...
ChatGPTで自然言語処理のData Augmentationやってみた。
ChatGPT(GPT-3.5)に対して元の文章と類似の文章作成してもらうことでData Augmentationを実施している記事。
ライブドアニュースコーパスに対してF値が0.844 → 0.857に上昇している。
なお、10時間かけても1500サンプルしか生成できず、お金もかかるので実用的では全くない(
コメント
試みとしては面白い。生成コストがもっと下がればわんちゃんありそう
出典
ChatGPTで自然言語処理のData Augmentationやってみた。