OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonのセッターゲッター

# Pythonのゲッターとセッターの基本の書き方

```python set_get.py
class TestProperty:
    def __init__(self, val):
        self.val = val  # セッターを使用

    @property
    def val(self):
        return self.__val

    @val.setter
    def val(self, val):
        self.__val = val

# main
obj = TestProperty(100)
print(obj.val) # ゲッターを使用
obj.val = 20
print(obj.val)

```
私フロントエンドエンジニアになります！

## はじめに
皆さん初めまして。ぐりと申します！
フロントエンドエンジニアになることを決意し、勉強したことをアウトプット目的で記事を投稿していこうと思っております。

## 自己紹介
何者なんだと思う方もいると思いますので、まずは自己紹介からさせていただきます。

・1998年生まれの25歳。男性
・私立理系卒
・社会人4年目
・趣味：筋トレとサウナ
・資格：ITパスポート、Google検索広告認定資格

##  経歴
<2017年4月〜2023年12月(2年10ヶ月)>
食品メーカーで工場現場責任者
→パートナーの管理、評価、教育などのマネジメント業務をメインでやっておりました。並行して現場の課題改善のプロジェクトのリーダーなどもしておりました。
 
<2024年01月〜現在（入社8ヶ月目)>
IT企業でSES営業
→エンジニアの提案、取引先拡大、フォロー、採用面談など幅広く業務を行っております。

##  なぜエンジニア志望に？
高校でプログラミングの授業があり、C言語を少し学びました。当時は全く理解できず、これは別世界だなという印象で、自分には向いてないだろうなと思っておりました。そこから約10年ほど経ち、ご縁がありましてSES営業をすることになりました。そこから開発に興味を持ったことと、また、20代後半に突入し、このままでは何のスキルも身に付かず、将来に漠然とした不安を抱えていたところから、自分のスキルを磨いて、もっと稼いで人生を豊かにしたいと考え、本格的にエンジニアになろうと決心しました。

##  学習内容
2024年8月3日より本格的に学習を開始しました。基本的にはudemyで学習を行っております。プログラミングスクールも検討中です。

・プログラミングを始めるにあたっての事前知識
・プログラミングの仕組み
・JavaScript、TypeScript

##  最後に
Qiitaをうまく使って、アウトプットをしていきたいと思っております。また、同じような境遇の方などいましたら仲良くしていただけると大変嬉しいです。

誤った情報など発信していた際はご指摘いただけますと幸いでございます。
Qiitaで書いた記事が自分の財産になればなと思っておりまして、全力で頑張りますので応援いただけますと嬉しいです！よろしくお願いします！
Unity Inspectorの固定

## やり方１
ロックマーク（鍵のマーク）を押すと別のオブジェクトをクリックしても切り替わらない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/deb38265-6082-1173-a5ea-0106bb41fed4.png)

## やり方２
専用のinspectorを開く方法
![inspectorkotei.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/5666fa01-2eb1-89eb-b55b-0a47a81dde3a.gif)

オブジェクトを選択＞右クリック＞Propertiesをクリック

これで専用inspectorが開かれ、これは常に固定されている。

また追加でコンポーネント毎にも専用のinspectorを開くことができる
![inspectorkotei2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/c9f7d854-4630-ecdb-78f4-0bb35b1a7a3f.gif)
コンポーネントの設定＞Properties

scriptableオブジェクトを専用に開いて固定しておくとデバッグしやすくなるよ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/c750e388-de2d-cd7c-035e-3d9739ddbb8c.png)



## 参考サイト

https://docs.unity3d.com/ja/2021.2/Manual/InspectorFocused.html
RestControllerのswagger-uiでの名称変更

デフォルトだと`@RestController`のクラス名がそのまま表示されるため、それを変更するには`@Tag`を使用する。

```java
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@Tag(name = "サンプルその１")
@RestController
public class Tag1SampleRest {

  @GetMapping("/foo/hoge")
  public String fooHoge() {
    return null;
  }

  @GetMapping("/foo/hoge222")
  public String fooHoge222() {
    return null;
  }
}
```

使用例は以下の通り。

![swaggertag0001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31934/8bda2daf-ece1-1bdb-8de3-20e2b7eab7c9.jpeg)

なぜタグで表示名が変更できるのか？　きちんと調べたわけではないが、タグの本来の用途は複数のエンドポイントを論理的なグループでまとめる、というものらしい。`@RestController`単位にタグを付与するとそれらエンドポイントがそのタグでグループされる、よって結果的にタグで表示名が変更できる、のだと思う。以下ドキュメントのtagsの項を参照。

https://swagger.io/specification/#operation-object

なので、下記のように複数の`@RestContoller`にそれぞれ属するエンドポイントへ同一の`@Tag`を付与するとswagger-ui上ではそのグループとしてまとめて表示される。以下が使用例。

```java
@RestController
public class Tag1SampleRest {

  @GetMapping("/foo/hoge")
  @Tag(name = "異なるRestControllerのエンドポイントをタグでまとめる")
  public String fooHoge() {
    return null;
  }

  @GetMapping("/foo/hoge222")
  public String fooHoge222() {
    return null;
  }
}
```

```java
@RestController
public class Tag2SampleRest {

  @GetMapping("/bar/fuga")
  @Tag(name = "異なるRestControllerのエンドポイントをタグでまとめる")
  public String barFuga() {
    return null;
  }
}
```

画面表示例は以下の通り。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31934/3a981c35-6077-55f0-4ee9-a7bf40b5f110.png)

ちなみに、このタグは`@Operation`からも指定可能。

```java
  @GetMapping("/foo/hoge")
  @Operation(tags = "異なるRestControllerのエンドポイントをタグでまとめる")
  public String fooHoge() {
    return null;
  }
```


```gradle:build.gradle
plugins {
	id 'java'
	id 'org.springframework.boot' version '3.3.2'
	id 'io.spring.dependency-management' version '1.1.6'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(17)
	}
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.6.0'

	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
	useJUnitPlatform()
}
```
Python いろいろなリスト内包表記の使用法について

# はじめに
　paizaラーニング中、リスト内表記について、すぐに使用法を確認できるように、知っている範囲でまとめました。リスト内包表記はシンプルに記載でき、パイソニックなコードになり、かつ、スピードが上がるので好きな構文です。
　オライリー・ジャパンの「Python入門３」と[note.nkmk.me](https://note.nkmk.me/python-list-comprehension/#if-else)の記事を参照させてもらっています。
# リスト内包表記とは
　リスト内包表記は、あるシーケンスや iterable (イテレート可能オブジェクト) のそれぞれの要素に対して、**ある操作を行った結果を要素にしたリスト**を作ったり、**ある条件を満たす要素だけからなる部分シーケンスの作成**を簡潔に生成することができます。
 


# 基本構文
**[** expression **for** item **in** interable **]**

リスト内包表記は、括弧の中の 式、 for 句、そして0個以上の for か if 句で構成されます。
```python
Sequential_number = [x for x in range(5)]
print(Sequential_number)
# [0, 1, 2, 3, 4]
```
# for 句による操作
 0から5までの数を2乗してリストに追加する。
```python
squares = [x**2 for x in range(6)] #0から5まで
print(squares)
 #[0, 1, 4, 9, 16, 25]
```
 
 1から4までの数を２回ずつリストに追加する。

```python
a = [n for n in range(1,5) for _ in range(2)] 
print(a)
 #[1, 1, 2, 2, 3, 3, 4, 4]
```

 変数と`for`を２つ用いてリストを作成する。
```python
rows = range(1, 4) #1から3まで
cols = range(1, 3) #1から2まで
cells = [(row,col)for row in rows for col in cols]
print(cells)
#[(1, 1), (1, 2), (2, 1), (2, 2), (3, 1), (3, 2)]
```
　トランプの絵柄をS（スペード） , H（ハート） , D（ダイア） , C（クラブ） と表現するものとし、その絵柄の 1 からキングまでの各カードを S_1 , ... , S_13 のように表現するリストを作成する。
```python
marks = ["S_", "H_", "D_", "C_"]
cords = [x + str(i) for x in marks for i in range(1,14)]
print(cords)
#['S_1', 'S_2', 'S_3', 'S_4', 'S_5', 'S_6', 'S_7', 'S_8', 'S_9', 'S_10', 'S_11', 'S_12', 'S_13', 'H_1', 'H_2', 'H_3', 'H_4', 'H_5', 'H_6', 'H_7', 'H_8', 'H_9', 'H_10', 'H_11', 'H_12', 'H_13', 'D_1', 'D_2', 'D_3', 'D_4', 'D_5', 'D_6', 'D_7', 'D_8', 'D_9', 'D_10', 'D_11', 'D_12', 'D_13', 'C_1', 'C_2', 'C_3', 'C_4', 'C_5', 'C_6', 'C_7', 'C_8', 'C_9', 'C_10', 'C_11', 'C_12', 'C_13']
```

# if 句による操作
 １から５までの奇数だけのリストを作る。
```python
odd_number = [num for num in range(1, 6) if num % 2 == 1] 
print(odd_number)
#[1, 3, 5]
```
 複数の比較演算子を連結して、中間の要素のリストを作成する。
```python
a = [x for x in range(10) if 2 <= x <= 5]
print(a)
#[2, 3, 4, 5]
```

 `if~else`を使用して'even'と'odd'を交互に表示する。
```python
odd_even = ['odd' if i % 2 == 1 else 'even' for i in range(10)]
print(odd_even)
# ['even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even', 'odd']
```

# for 句とif 句の複合による操作
2つのリストの要素から、違うもの同士をペアにする。
```python
a = [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
print(a)
#[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
```
`for`と`if`で記載するとこの通り
```python
a = []
for x in [1,2,3]:
    for y in [3,1,4]:
        if x != y:
            a.append((x, y))
print(a)
#[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
```
# 二重のリスト内包表記 (コードは要修正)
### リストのフラット化
2階層のリストを1階層のリストに平坦化する。
```python
a = [[1, 2], [3, 4]]
flat_list = [item for l in a for item in l]
#上と同じ
flat_list = [item for l in [[1, 2],[3, 4]] for i in l]

print(flat_list)
#[1, 2, 3, 4]
```
参考　[Pythonでflatten（多次元リストを一次元に平坦化）](https://note.nkmk.me/python-list-flatten/#_1)
### 標準入力での活用
私の過去の記事ですが、標準入力でもいろいろなリスト内表記をまとめています。

https://qiita.com/fukufukusonreiz/items/de8f53b0be253318c352

# むすびに
　まとめることで頭が整理でき、身になるような気がします。新たな発見があり次第、加筆修正します。いろいろご助言いただけると嬉しいです。


https://docs.python.org/ja/3/tutorial/datastructures.html#list-comprehensions
Docker Selenium の最大セッション数の設定を docker run で指定する

## はじめに
Dockerのコンテナで運用しているSelenium Gridの最大セッション数を複数にしようとしたのですが、run コマンドからの指定する記事が無かったので備忘録

## コマンド
単純に docker run のオプションに環境変数として指定するだけです。

> ### 指定するオプション
> ```bat
> -e SE_NODE_MAX_SESSIONS=2
>```
### 具体例

```bat
docker run -d --name=selenium -p 4444:4444 -p 7900:7900 --shm-size="2g" -e SE_NODE_MAX_SESSIONS=2 seleniarm/standalone-chromium:latest
```
:::note warn
このコマンドはあくまで記者の場合です、適宜ご自身のものと合わせてください。
:::

## おわりに
docker最高。

https://qiita.com/kosupe/items/f28cbc1774bb6f550655
マウスのType-Aを接続すると無線Wi-Fiが途切れやすくなる

# この記事について
無線マウス(Type-A)を接続をすると、無線Wi-Fiの調子が悪くなるという状況に遭遇したので解決方法のメモです！

# 直ぐに解決したい人向け
接続するWi-Fiを5GHzの回線にすることで治せます！

# 試したこと
下記のサイトの投稿で解決方法を見つけました。

https://answers.microsoft.com/ja-jp/surface/forum/all/surfacepro4%E3%81%A7usb%E3%81%AB%E3%83%89%E3%83%A9/bea2f122-0df5-427d-9e02-5ff7882d8ad3

電源プランを**高パフォーマンス**にすると解決するらしいので、電源プランを変更してみます。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/fa93d971-6297-a30f-56cb-95194496d276.png)

下記事を参考にして電源プランを変更しました。

https://atmarkit.itmedia.co.jp/ait/articles/1810/29/news019.html

電源プランを高パフォーマンスにしてみましたが解決はできませんでした。

次に、Wi-Fiの回線が影響している可能性があるという記事を見つけたので、Wi-Fiの回線を変更してました。

https://okbizcs.okwave.jp/elecom/qa/q10006668.html

上の記事の回答です。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/71911234-12c7-1cb6-8896-9f7a91d7366e.png)

Wi-Fiを5GHzに変更する手順ですが、自宅のWi-Fiルーターが2.4GHzと5GHzの回線を利用できる物だったので回線をつなぎ直すだけで変更は終わりました。回線を変更した所、Wi-Fiが途切れなくなったので無事に解決することが出来ました！

# 2.4GHzと5GHzの違い

数値の違いが少し気になったので軽く調べました。

https://flets-w.com/chienetta/pc_mobile/cb_other59.html

上記の記事に分かりやすい内容があったので画像を引用すると
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/133061fa-1296-7441-d0f5-2b341b258872.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/8e82d332-ff1a-d578-6b47-6a85cba2345d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/1dbca6d1-2bd7-9d9f-d704-13c0142fa6b9.png)

などの内容になっていて、Type-Aの電波によって無線Wi-Fiが途切れていた可能性が高そうです。
FlutterでiPhoneに実機ビルドする

## はじめに
表題通り、Flutterで作成したプロジェクトをiPhoneに実機ビルドします。

## 事前準備 iPhone
実機ビルドするには、デベロッパモードを有効化しておく必要があります。
「設定」→「プライバシーとセキュリティ」→「デベロッパモード」→「デベロッパモードを有効化する」

<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/52793443-f7eb-15c8-6505-79b0a492712f.png">

:::note warn
デベロッパモードを有効化するとiPhoneが再起動しますので、ご注意ください。
:::


## Xcodeでプロジェクトをビルドする

1. Xcodeを開き、対象プロジェクトを開きます
「Open　Existing Project...」で対象設定を開く
<img width="４00" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/65453608-675d-589e-da72-9dd914a60665.png">

2. 対象プロジェクトから、ios>Runner.xcodeprojを開く
<img width="４00" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/a8cba663-306f-fdf2-c30a-fb889ec447e8.png">

３. Teamからアカウントを選択する。

![スクリーンショット 2024-08-07 19.58.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/8d13ebb0-e5b3-7f2f-11e7-c095de93b9ca.png)

:::note warn
まだ、Sigininしていない人は「Add an Account」からAppleIDでログインする
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/8dbd0f9c-c754-a5cc-af42-fb98a8d1979c.png">
:::

![スクリーンショット 2024-08-07 20.14.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/1b376793-1ad6-414a-28d4-72d016ab8473.png)

ビルドが完了すると実機にプロジェクトがビルドされます。


<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/11b0b680-390d-4ffa-ec6d-ed3649cd3b52.png">
PODの作り方（iPhoneアプリ制作）





ディレクトリ移動しプロジェクトの直下に移動してください
    
    cd Documents/XXX

下記を実行するとpodファイルがプロジェクト配下にできる
    
    pod init
    
Podfileをエディターで修正
下記のようにPodfileを修正
　※今回はAdmobを入れたい

    platform :ios, '15.0'
    target 'XXX' do
      use_frameworks!
      pod 'Google-Mobile-Ads-SDK'
    end

修正後下記実行
    
    pod update



完了
AWS API GatewayのHTTP APIとREAT APIの違い

# はじめに

AWS API Gatewayは、APIを作成、管理、保護するためのサービスです。

API Gatewayでは次の4つのタイプが提供されています。

* HTTP API
* REST API
* WebSocket API
* REST APIプライベート

今回はHTTP APIとREST APIを取り上げ、それぞれのAPIタイプの違いと選択基準について説明します。

https://aws.amazon.com/jp/api-gateway/

## 1. HTTP API

### 1.1 概要

HTTP APIは、シンプルで低レイテンシなHTTPリクエストの処理に最適化されたAPIタイプです。
主に、迅速な開発と低コストを重視する場合に適しています。

### 1.2 特徴

- **低コスト**: HTTP APIは、従量課金制であり、REST APIよりも一般的にコストが低くなります。
- **低レイテンシ**: 高速なレスポンスが期待でき、サーバーレスアーキテクチャに最適です。
- **簡素な設定**: APIの作成と管理が簡単で、少ない設定項目で済みます。
- **Lambda統合**: Lambda関数との統合が簡単に設定できる。
- **WebSocketサポート**: HTTP APIではWebSocket APIがサポートされています。

### 1.3 適用例

- シンプルなAPIエンドポイント
- マイクロサービスのエンドポイント
- リアルタイムアプリケーションのバックエンド

## 2. REST API

### 2.1 概要

REST APIは、より複雑なAPI管理と機能を提供するAPIタイプです。
詳細な設定オプションや、リソースベースのAPI設計を必要とする場合に最適です。

### 2.2 特徴

- **高機能**: 詳細なキャッシュ設定、バージョニング、リソースポリシーなどの高機能な設定が可能です。
- **認証と承認**: IAMポリシー、Cognitoユーザープール、カスタムオーソライザーなど、多様な認証オプションがあります。
- **リソースベースの設計**: リソースごとのメソッド設定や、詳細なエラーハンドリングが可能です。
- **API Gatewayコンソール**: 詳細なデバッグ情報やトラフィック分析機能が提供されます。

### 2.3 適用例

- 複雑なAPIエンドポイント
- 高度な認証や承認が必要なAPI
- リソースやメソッドの詳細な制御が必要な場合

## 3. 比較まとめ

| 特徴           | HTTP API                                      | REST API                                  |
|----------------|-----------------------------------------------|-------------------------------------------|
| **コスト**      | 低コスト                                      | 高コスト                      |
| **レイテンシ**  | 低レイテンシ                                    | 通常のレイテンシ                            |
| **機能**        | 基本的な機能                                   | 高度な機能（キャッシュ、バージョニング等） |
| **設定の簡便さ**| 簡単                                          | 詳細な設定が必要                           |
| **認証**        | Lambda、IAM                                    | Lambda、IAM、Cognito、カスタムオーソライザー       |

## 4. どちらを選ぶべきか？

- **シンプルなAPIエンドポイント**や**低コスト**を重視する場合は、HTTP APIが適しています。
- **複雑なAPI**や**詳細な認証設定**、**リソースごとの管理**が必要な場合は、REST APIを選択するのが良いでしょう。

## 5. まとめ

AWS API Gatewayでは、HTTP APIとREST APIの2つのAPIタイプが提供されており、それぞれ異なる機能と特徴があります。

ニーズに応じて適切なAPIタイプを選ぶことになりますが、簡単に言うと要件が少なくシンプルなものでいいのであればHTTP API、複雑で高度な設定を要するものであればREST APIを選ぶことになると思います。
研究室のLinuxでパリオリンピックを見たかったんだ！！！

# きっかけ
2024年7月26日に開幕したパリオリンピック．パリオリンピックのほぼ全競技がTverで観られるとのことだったので，研究室のPCでスケートボード女子パークの予選を見ようと思ったらPCのOSがLinuxのせいで観られない！これを解決して今後の研究室ライフを豊かなものに！（この記事が刺さるユーザはどれほどいるだろうか……）

# 前提
- OSはLinux（Debian）
- ブラウザはGoogle Chrome

# 今回やること
- [Google ChromeでUserAgentを変更する](https://qiita.com/pepo/items/565f0a8b9bd277cfb4ec)を参考にUserAgentを変更する

# 現状
TVerの画面やパリオリンピックの画面を記事に載せると権利関係で面倒くさそうなので言葉で伝える．TVer内で観たい番組やライブ配信ページに飛ぶと通常は放送画面があり，そこを押すと放送されるが，研究室のPCでは押すことができず，放送画面の下に「アプリで視聴する」というボタンが出ていて，ボタンを押しても同じページに戻ってしまう．

# UserAgentを変更する
解決するにはGoogle ChromeでUserAgentを変更すればいい．画像付きの方がわかりやすいので[Google ChromeでUserAgentを変更する](https://qiita.com/pepo/items/565f0a8b9bd277cfb4ec)を読むのをおすすめする．
手順としては
1. F12を押してDeveloper Toolsを開く
2. 出現した画面の上部にある「Elements」の左にあるスマートフォンのアイコンをクリックし(Ctrl+Shift+MでDevice modeのon/offが可能)，device toolbarを開く
3. 放送画面の上に出てきたdevice toolbarで好きなデバイスを選ぶ．自分の環境ではiPad proを選択している．
4. この状態で画面をリロード(F5など)した後にF12を押して画面を戻せばいつもの画面でTVerが放送される．

1回設定すれば再起動するまで(？) F12 -> F5 -> F12と押していけば設定が適用されるからワンクリックで発火するショートカットにするのもいいなぁ

# 参考文献
この記事は以下の情報を参考にして執筆しました．
- [Google ChromeでUserAgentを変更する](https://qiita.com/pepo/items/565f0a8b9bd277cfb4ec)
pixelSplat: 3D Gaussian Splats from Image Pairs for Scalable Generalizable 3D Reconstruction

# 1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/9124bb6c-31ad-e6c2-63ff-3cc1ac81008c.png)

3D Gaussian Splatting(SIGGRAPH2023)は、3次元シーンを多数のガウシアン分布の形状で表現する新しい技術で、多視点画像を入力として高品質な任意視点画像を高速に生成できる特徴がある。従来、NeRF(Neural Radiance Field)ベースの手法がよく研究されているが、シーン全体を表現する連続関数を学習するため、メモリ効率が悪く、レンダリング速度が遅いという課題があった。3D Gaussian Splattingでは、シーンを疎なデータ構造で表現できるためメモリ効率が高く、高速レンダリングを特徴とする。

この研究では、2枚の画像を入力として3次元ガウシアン分布で表現される光の放射輝度(3D Radiance Field：3次元放射輝度場)を表現した関数を再構成する手法を提案している。提案手法では、学習時にリアルタイムかつメモリ効率の高いレンダリングを実現しており、推論時には高速な3次元再構成を実現している。

*Honorable Mention Award

---

# 2. 新規性
3次元ガウシアン分布を用いた表現は、NeRFに比べて疎な表現のため高速に動作するが、疎で局所的にしか表現できない局所最小値問題に陥ることがある。そこでこの研究では、奥行き方向に対してピクセル毎に離散確率分布を予測して、サンプリングを擬似的に密にする。予測した離散確率分布からガウス分布の平均値をサンプリングして3次元ガウシアンの位置を決めるが、このサンプリング操作は再パラメータ化トリックで微分可能なため、ガウシアンスプラッティングの表現を通じて勾配を逆伝播させることができる。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/1848ed7a-cdd4-b936-3e3e-821f2a0f03d5.png)

まず、各ピクセルに対応するガウシアンの確率分布を予測するために、2枚の画像からCNN(畳み込みニューラルネットワーク)を使って特徴量を抽出しておく。入力特徴マップ内の各ピクセル特徴 F[u] に対し、ニューラルネットワーク f を使って、3次元ガウシアン分布のパラメータ Σ (共分散行列)と S を予測する。
ガウス分布の平均値 μ (3次元位置)と不透明度 α を直接予測してしまうと局所最小値問題に陥ってしまうため、ニューラルネットワークでは直接予測しない。代わりに、ニューラルネットワーク f は深さ z に対するピクセルごとの離散確率分布 pϕ(z) を予測する。この確率分布は ϕ によってパラメータ化されている。

次に、サンプリングによって3次元ガウシアン分布の位置を決定する。各ガウシアンの不透明度は、サンプリングされた深さ z の確率に応じて設定される。任意視点からのレンダリング手法は従来技術を用いている。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/c443ba7c-da88-0617-f11f-997cd4b3938e.png)

NeRFベースの手法では、密な連続関数でシーン全体を表現してしまうため、前処理や後処理といった編集が困難であったが、3D Gausssian Splattingでは3次元空間をガウシアンで表現するため、シーンの解釈や編集が容易になった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/4778d5ea-00c0-52a9-eda6-90b135a6011d.png)

RealEstate10kとACIDデータセットを用いた広視野角の任意視点合成タスクに対して、提案手法では従来手法よりも高品質でメモリ使用率が極めて低く、推論時間も早かった。レンダリング速度に関しては、従来手法よりも最大で2.5倍高速になっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/7cc7dff0-bce8-0844-1d00-cf8def10e137.png)

従来手法のLight Field Transformerよりも高品質に任意視点画像を生成できている。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2024/papers/Charatan_pixelSplat_3D_Gaussian_Splats_from_Image_Pairs_for_Scalable_Generalizable_CVPR_2024_paper.pdf>

last updates: June. 19 2024
EventPS: Real-Time Photometric Stereo Using an Event Camera

# 1. 概要
複数の異なる光源を用いて撮影した画像群を用いて、物体の表面の方向(法線)を予測する技術のことをフォトメトリックステレオと呼ぶ。一般的に、対象物に対して異なる方向から光を当てながら複数の画像を撮影し、各ピクセルの輝度値を計測して輝度値の変化パターンを分析し表面法線を推定していくため、非接触な計測が可能である。
従来手法では、異なる照明条件下で複数のハイダイナミックレンジ画像(HDR)を撮影する必要があったため速度が制限されリアルタイムアプリケーションへの適用が困難だった。

この研究では、イベントカメラを用いた新しいリアルタイムフォトメトリックステレオ手法であるEventPSを提案している。イベントカメラが時間分解能が高く、ダイナミックレンジや低帯域幅があるという特性を生かし、提案手法では放射輝度の変化のみから表面法線を推定することで、データ効率を大幅に向上させている。

*Honorable Mention Award

---

# 2. 新規性
- イベントカメラを用いたフォトメトリックステレオ技術：
従来のフレームベースのカメラではなく、イベントカメラを用いた形状復元技術を提案している
- 放射輝度変化に基づく表面法線推定：
放射輝度の変化情報のみを用いて表面法線を求めている
- 最適化手法と深層学習手法の統合：
様々な反射特性やシーン条件に対応可能な手法を提案している

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/0772bfe6-3d09-a081-794f-4ac77637f806.png)

上図が提案手法であるイベントカメラベースの手法を示しており、下図が従来手法であるフレームベースカメラの手法を示している。

1. 連続的に回転する光源(a)によって変化する光線を、イベントカメラを用いて撮影しシーンの放射輝度変化を取得する。(1800 RPM Lightning)
2. 取得したイベントデータに対して最適化ベースの手法と深層学習ベースの手法を用いて表面法線を推定する。イベントカメラの持つ、低遅延性・ハイダイナミックレンジ・データ表現の冗長性の低さなどの特徴により、高速かつ効率的なリアルタイム処理(c, d)を可能にしている。(30FPS)
3. 必要に応じてふくすうのフレームからの情報を統合したり、推定された表面法線を修正したりすることでより高精細な形状復元を実現する。住アリのフレームベースの手法に匹敵する性能を維持しながら帯域幅の使用量を大幅に削減できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/eeb1d5fc-1ada-89b6-b93f-0aaf5b329f52.png)

表面法線の推定には深層学習が用いられている。まず、一定時間ごとのイベントを合計してベクトル空間に変換する。次に、各時間のベクトル情報を合成して全体のマップを生成する。ここで、PS-FCN(Photometric Stereo Fully Convolutional Network)を用いて、合成したベクトルマップを入力として各ピクセルの表面法線を予測していく。従来のPS-FCNはシーン全体の画像を入力としていた。最後に、観測されたベクトルマップの特徴を学習させて、各ピクセルの表面法線を推定する。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/2e7f3e2e-de87-611e-bb5f-c0ea2a2113b8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/433aeed1-115e-0a88-bc6d-7a2c28fca4b5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/b4b05aea-3c5d-9461-8913-fd2bd7ae2703.png)

高速レンダリングを実現しており、30fps以上で高速動作することを確認している。また、従来のフレームベースの手法と比較して様々なシーンに対してより高精度な表面法線推定を実現した。放射輝度変化のみを使っているため、従来手法よりも少ないデータ量で高品質な形状復元を可能にしている。

---

Paper URL: <https://openaccess.thecvf.com/content/CVPR2024/papers/Yu_EventPS_Real-Time_Photometric_Stereo_Using_an_Event_Camera_CVPR_2024_paper.pdf>

last updates: June. 19 2024
無駄な「えー」はさようなら！あなたの意志を5割り増しで伝える方法！

# 無駄な「えー」はさようなら！あなたの意志を5割り増しで伝える方法！

![title](https://raw.githubusercontent.com/legitwhiz/legitwhiz.github.io/master/technology_memo/images/1000007832.jpg)

## 会話に無駄が多い人

接続詞に「えー」、「えっと」とか打合せする前に話す事ぐらい考えてから来て下さい。

毎朝の打ち合わせで、会話の中に無駄な接続詞ばかりで全然進まない上に何を伝えたいのか分かりません…

「ということは」「そして」「したがって」「だから」等の接続詞なんて無くても会話は成り立ちます!!

色々と説明した後に伝わらないからって「まず言いたいことは」ってぇ…

結論は、最初に報告しろって、新人研修でやったでしょ!?多分…

研修をきちんとやっている会社なら「PREP法」とかやってそうだけどなぁ～

## PREP法とは

PREP法とは、下記の言葉の頭文字

P　OINT＝ポイント、結論
R　EASON＝理由
E　XAMPLE＝事例、具体例
P　OINT＝ポイント、結論を繰り返す｡

【例】
私はバナナが好きだ
なぜなら、おいしいし、カロリーが高く早く消化されるから
例えば、テニス選手が試合中に食べることもあるほどだ
だから、私はバナナが好きだ
という感じです｡

このようにPREP法で話すと理論的でわかりやすい話し方になります｡

## だけど現実は

ですが、PREP法等の話し方だけの問題では解決しません｡
仕事では、「思い」ではなく「考え」を話して欲しいです。

「論理的」に話す事が重要なのではなく、「意思」を伝える大事なので!!

ってぇこれを書きながら私も出来てないですねw
Rotating Features for Object Discovery

# 1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/f808485b-a2b0-31fa-d1ff-6f370f5ce947.png)

人間の脳がどのように物事を捉え、脳内の神経結合ネットワークでそれらを結びつけるのかという仕組みについては未だに解明されておらず、”The Binding Problem”(結合問題)として知られる。機械学習を用いてこの問題を明らかにする手法も提案されているが、従来手法では教師なしの設定で主にスロットベースの手法が用いられており、離散的な性質と不確実性を表現する難しさから制約が生じていた。この論文では、"Rotating Features"(回転する特徴)を導入し、複素数値特徴を高次元に拡張し、分散表現から物体を抽出する新しい評価手法を提案している。

*Oral Paper

---

# 2. 新規性
従来手法では教師なし手法を用いており結合問題に対して限定的なアプローチだったが、提案手法では物体の特徴量に回転要素を取り入れ学習型にすることで、従来手法では難しかった物体の高次元な表現が可能となった。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/312efe34-c1a1-952c-665e-6f1f1a6292a9.png)

まず、入力を含むアーキテクチャ全体に対して、1つ次元を追加し”Rotating Features”を特徴量として表現できるようにする。ここで、”Rotating Features”の大きさ(m)が特徴の存在を表し、その方向が物体のクラスを表す空間を用いる。mを用いて物体形状を再構成させるように学習させる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/81a92cf0-7f26-92c1-8b5e-e16a537e60e1.png)

学習後に未知の物体を入力として、回転特徴空間上で正規化、クラスタリングを行い、回転特徴をある範囲で分けるとそれが物体ごとのセグメンテーション結果になっている。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/a42a6875-209d-7c9d-9f01-a662821a4c00.png)

実世界の物体に対しても回転特徴を用いたセグメンテーションが有効であることを示しており、Toy Examplesだけでなく現実世界にも適用可能な手法となっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/2d0acc8e-99ae-7fd1-03ec-5e10ef04833f.png)

不確実性を持つような分類が難しいシーンに対しても、その領域を推定して表現に含めることができている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/49e084cb-e2ae-792e-e151-5355a1c0d03d.png)

従来手法であるスロットベースな方法は、物体数が増えると精度が劇的に落ちる傾向があったが、提案手法では未知の物体に対する認識性能が物体数に対して頑健になっている。

---

Paper URL: <https://openreview.net/pdf?id=fg7iyNK81W>

last updates: Dec 25 2023
Linguistic Binding in Diffusion Models: Enhancing Attribute Correspondence through Attention Map Alignment

# 1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/751d60ed-6205-fcbb-28d1-2cb31adf5f8c.png)

この論文では、テキストに基づく画像生成モデル(Text-to-Image)が生成対象の実体をよくわかっておらず、言葉による編集で変更すべき関連性を正しく生成できない問題に焦点を当てている。具体的には、テキストの指示と生成された画像の対応関係において、適切なマッピングが行われていないことが課題となる。提案手法では、まずテキストを文法的に解析して編集対象の物体とその修飾方法を認識する。次に、新たな損失関数を導入して、クロスアテンションマップが文法に基づいた言語的な特徴をうまく画像特徴と一致させるように促す。これにより、テキストから画像への生成の信頼度が向上する。

*Oral Paper

---

# 2. 新規性
従来手法では、テキストと画像の対応付けにおいて誤った関連性がマッピングされてしまい、出力結果が人間の意図した通りにならないという問題があった。提案手法のSynGenは、まずテキストを文法的に分析し、それに基づいて生成された画像との対応を改善する点が新しい。特に、新たな損失関数を導入しており、編集対象の物体と修飾方法のアテンションマップ同士の一致を促すことで、信頼度の高い生成結果を実現している。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/01cc98ab-b5ff-f6cb-4d20-11c582801ae4.png)

テキストを文法的に解析して、編集対象の物体を特定するとともにどのように編集するのか修飾方法も特定する。その後、損失関数によって、編集対象の物体と修飾方法のアテンションマップ同士の重なりを大きくして、その他の物体や修飾語との重なりを小さくしていくことで適切な物体を適切な方法で修飾できるようにする。新たに導入された損失関数は、モデルの再トレーニングやFine-Tuningを一切必要とせず、推論中に最適化されるため利便性が高い。


---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/820eefe3-bcdd-3b2d-8ae5-bb2890caadf2.png)
![uploading...0]()

3つのデータセットで性能評価されており、Stable Diffusionなどの従来手法と比べて劇的に精度を向上させた。推論中に文の構造解析結果を活用することが、テキストから画像への生成クオリティを効果的かつ劇的に向上させることを明らかにしている。

---

Paper URL: <https://openreview.net/pdf?id=AOKU4nRw1W>

last updates: Dec 25 2023
Additive Decoders for Latent Variables Identification and Cartesian-Product Extrapolation

# 1. 概要
データやサンプルがモデルが学習したデータの範囲外にあることを”out-of-data”問題と言い、例えばモデルが学習したデータ分布の範囲外にある画像を生成することが難しいことが挙げられる。この論文では、Representation Leaning(表現学習)において、データから特定の特徴を見つけ出す存在変数の同定処理を提案しており、"out-of-data"に対応した学習データに含まれていない画像の生成を実現している。

*Oral Paper

---

# 2. 新規性
特定クラスのデコーダーを”Additive”(加算可能な)ものとして扱い、これを用いて潜在変数の同定と画像生成が可能であることを示している。これらのデコーダーは、”Object-Centric Representation Learning(OCRL)”(物体中心の表現学習)に用いられるデコーダーと類似しており、一枚の入力画像をオブジェクトごとの小さな画像の合計として分解できると考える。提案手法では、特定の条件下で潜在変数の同定を確実に行えることを示しており、その条件も弱い仮定しか必要としない点が新規性にもなっている。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/5e19978b-8ca5-ec62-a21e-ab0e120953f0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/b3195cee-8dbf-2486-0031-8998e6add5b2.png)

”Additive Decorders”(加算可能なデコーダー)を提案しており、これを使って画像を個々の物体に分解して再構築する問題を解く。潜在変数のブロックをブロックごと画像へと逆変換可能な状態でデータ分布を同定できる。潜在変数の分布については非常に弱い制約しか必要としないので、その分布が統計的な依存関係を保持しており、ほぼ任意の形状に対応できる。
また、提案手法である”Additive Decorders”は、観測された変動の要因をブロックごと直接組み合わせることで、学習データに存在しなかった新たな画像を再構成できる能力を持っていることを示しており、これを”直接外挿”と呼んでいる。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/d43a1874-a35b-2eb7-8b8d-0f195825e930.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/ea9aed72-918b-9a95-b9fe-f7d1d1c839e0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/a44c89e3-1e87-3b76-f52f-04cc49167a90.png)

提案手法はシミュレーションされたデータにおいて、潜在変数の同定と外挿の両方において有効であることを示している。特に、学習データに含まれていない分布のデータをデコーダーで加算的に補えるという新しい発想が功を奏している。

---

Paper URL: <https://openreview.net/pdf?id=R6KJN1AUAR>

last updates: Dec 25 2023
Emergence of Shape Bias in Convolutional Neural Networks through Activation Sparsity

# 1. 概要
現在のディープラーニングを用いたCNNs(Convolutional Neural Networks)系の物体認識モデルは、テクスチャ成分に強くバイアスを受ける一方で、人間の視覚システムは物体の形状と構造にバイアスを受けるという違いがあるという点に焦点を当てた論文。”Sparce Coding”という、生物の視覚システムなどで観察される情報符号化の表現方法があり、非常に少数の要素だけが非ゼロであるような表現となっているが、この研究では脳神経科学で用いられる”Sparce Coding”を用いることで、ニューラルネットワークに形状バイアスを導入する方法を提案している。これにより、物体を部分空間やサブパーツに分割して、生物的な認知に近い形状バイアスを含められるようにした。

*Oral Paper

---

# 2. 新規性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/ae1960a1-b640-6bf9-c8d7-66768f0956b5.png)

”Sparce Coding”を利用して、ニューラルネットワークに形状バイアスを導入した。この手法によって、CNNs内のニューロンが構造的な符号化を学習し、形状に対するバイアスを獲得できるようにした。従来のCNNsはテクスチャ成分に強いバイアスを受けるため、画像の例のように人の目では猫が見えていてもテクスチャ成分に引っ張られて象と認識してしまう。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/a97d277f-3d7e-ed86-90c7-f806207a478e.png)

提案手法では、CNNsのブロック内で非微分可能なTop-K演算を用いて、”Sparce Coding”(疎な符号化制約)を強制的に制約条件とさせる。Top-K演算では、上位K個のニューロンだけを発火させ、それ以外を抑制する。この制約を導入することで、CNNsのニューロンが経常的な情報をエンコードできるようになる。これにより、物体の形状や構造が滑らかに分解され、形状バイアスが後段ネットワークに伝播する。
画像のように2つのアプローチを導入しており、左図ではTop-K演算をニューロンの発火部分だけに導入してモデルの形状バイアスに影響を与えている。右図では、多段にTop-K演算を導入しUNetのようにダウンサンプリングとアップサンプリングをしたときに、同じ解像度を持つレイヤーでロスを取り、強力に形状バイアスをかけている。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/81678e7d-12cb-2b64-0fb8-ccc0525b5f08.png)

物体認識用のCNNsに提案手法を挿入したところ、テクスチャへの依存度が減り形状へのバイアスが高まっていることが分かった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/afab01dd-c66c-c5b5-b832-8f7f6692ebda.png)

敵対的生成ネットワーク(GANs)に組み込んだところ、形状バイアスの導入によって生成された画像がより分解可能なパーツごとに再構成される傾向がみられ、画像の結合がより自然になっていた。

---

Paper URL: <https://openreview.net/pdf?id=QzcZb3fWmW>

last updates: Dec 25 2023
TypeScriptのオブジェクトから邪魔なキーを動的に消す

TypeScriptには`Pick`だとか`Omit`だとか便利な型ユーティリティが組み込みでありますが、あれらじゃ足りないことがたまにあります。
例えば、`e`から始まるキーだけ抽出したいとか。

そういうときはmapped typesで[キーを再マッピング](https://www.typescriptlang.org/docs/handbook/2/mapped-types.html#key-remapping-via-as)しましょう。

```ts
/**
* プロパティの名前が`e`で始まるエントリだけ抽出します。
*/
type PickElegantEntry<R extends Record<PropertyKey, unknown>> = {
    [k in keyof R as `${k extends `e${string}` ? r : never }`]: R[k]
}
```

面白いことに、再マッピングで`never`を返すとそのキーについては除外されます。なので、出力はこうなります:

```ts
type RushE = PickElegantEntry<{
    elegant: 1,
    notElegant: "excluded!",
    elephant: 2,
    electricity: 3
}>;

const eeeeee: RushE = { elegant: 1, elephant: 2, electricity: 3 };
```
Are Emergent Abilities of Large Language Models a Mirage?

# 1. 概要
大規模言語モデル(LLM)の登場により、これまでの小規模なモデルには見られない能力が発現していることを明らかにした論文。ここで、”Sharpness”(鮮明さ)と”Unpredictability”(予測不能性)という2つの側面からLLMの能力について調査しており、"Sharpness"は小さなモデルでは存在しない能力が大規模なモデルになったとたん突如として現れることを指しており、”Unpredictability”は予測できないほど大きくなるモデルのスケールによって現れることを指している。
実験では、特定のタスクとモデルにおいて、固定されたモデルの出力を分析したところ、LLMの能力はスケールの変化ではなく、研究者が選んだ評価基準であるメトリックスによるものであることを発見した。つまり、研究者が選んだ評価基準によって、非線形または不連続なメトリックスが大規模言語モデルが小規模なモデルには見られない”Sharpness”や”Unpredictability”といった能力を見かけ上発現させているとしている。また、線形または連続なメトリックスを選定した場合には、なめらかで連続的で予測可能な変化をもたらすことが示されている。

*Oral Paper

---

# 2. 新規性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/0269f2cf-c76c-00bc-a84a-0fa17b3fd5b4.png)

”Sharpness”や”Unpredictability”といった大規模言語モデル特有の能力とされていたものが、実はモデルのスケールとは関係なく、評価基準の選択によって生じているに過ぎないことを明らかにした。具体的な例として、異なる種類のメトリックスを選択することで、性能が急激に変化することがあり、これがLLMの新たな能力として観察された理由だと考えられる。

---

# 3. 実現方法
実験では、異なる種類のメトリックスがモデルの性能に与える影響を調査するため、(A)トークンごとのクロスエントロピーロス、(B)トークンの正確な選択確率、(C)研究者が設定する非線形なメトリックス(e.g. Accuracy)、(D)研究者が設定する不連続なメトリックス(e.g. Multiple Choice Grade)、(E)非線形なメトリックスから線形なメトリックスに変化させるもの(e.g. Token Edit Distance)、(F)不連続なメトリックスから連続なメトリックスへ変化させるもの(e.g. Brier Score)をそれぞれ評価した。特に、(E)と(F)は異なるメトリックスを用いることでモデルの基本的な振る舞いではなく、メトリックスの選択によって引き起こされるかどうかを確かめている。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/01c45e59-cd28-621b-efff-2c4876bacec0.png)

InstructGPT/GPT-3を用いた実験において、LLMの新たな能力とされた”Sharpness”や”Unpredictability”が、異なるメトリックスを用いることで影響を受け、スケールに依存せずメトリックスの選択によって解釈が変わることを確認した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/d63f1701-01d5-e8cd-322c-66e2730d9da8.png)

また、BIG-Benchでの実験においても同様の傾向が見られたことから、大規模言語モデルのスケーリングに基づく能力の発現ではなく、メトリックスの選択に依存する可能性が示唆されている。

---

Paper URL: <https://openreview.net/pdf?id=ITw9edRDlD>

last updates: Jan 5 2024
Privacy Auditing with One (1) Training Run

# 1. 概要
この論文では、一度の学習で推論可能な、プライバシー状態を検査できる”Differencial”(分離可能な)機械学習システムを提案している。"Differential Privacy"(分離可能なプライバシー情報)の定義として、あるランダムなアルゴリズム(M)が存在するとき分離可能なプライバシー性を持っていれば、データセット全体(x)に対して追加あるいは削除した特定の個人情報(x')は以下の分布式(ε, σ)に従うとしている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/65f54f0d-11a5-c89b-4399-b7f2b884f293.png)

提案手法では、複数のデータセットの学習対象を独立に追加したり除外したりできる学習データの並列作用を利用しており、統計的な汎化性と分離可能なプライバシーとの関連性を調べたうえで、データセットごとのプライバシー情報のコストを最小化するように設計されている。これにより、分布式(ε, σ)の上限と下限の境界条件を明らかにした。

*Oral Paper

---

# 2. 新規性
提案手法は、一度の学習で即座に推論可能なプライバシー情報の検査方法を新規性としており、従来手法では数百回から数千回の学習が必要だったことから、実用面での効率性を各段に飛躍させた。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/74865b93-8ac9-e01b-3f34-abba109d5e3c.png)

あるデータセットから100,000のモデルを学習したものをオレンジの分布で表現しており、これとは別のデータセットから学習された100,000のモデルを青の分布で示している。ある閾値(τ=2.64)を設けると、True Positiveが4.922%となりFalse Positiveが0.174%となった。Clopper-Pearson境界条件を用いることで、ε>2.79を満たす場合、分布面積は1-10^-10となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/ba846309-225c-4ccf-692b-7d8d29e51848.png)

ここで、システムが推定に成功した回数がランダムな回答で正解した回数を下回った場合、そのアルゴリズムは(ε, σ)を満たす。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/5278afa6-9c75-709a-c7a9-17aab18fd51c.png)

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/ef343cd6-8b36-f91d-87ec-d9c9726c1c97.png)

アルゴリズムのステップに従って、最初のm個の例の中にプライバシー情報を50%の確率で含め、各列に対してスコアを計算し、これらのスコアに従って個別のプライバシーの例が含まれているかをシステムが推定する。
実験は、モデルの重みのすべての中央値を利用するホワイトボックステスト(左図)と、最終的なモデルの重みしか与えられず最終的なモデルのみクエリを発行できるブラックボックステスト(右図)で行われている。ホワイトボックステストは、Federated Learning(連合学習)を想定しており、ブラックボックステストは中央集権的なシステムを想定している。左図では、検査対象の例が増えるほどεの下限を実験的に求めることができていることを示している。右図では、追加の例を増やすとブラックボックステストの検査結果に対してかなり変動的な影響を与えることを示している。

---

Paper URL: <https://openreview.net/pdf?id=f38EY21lBw>

last updates: Jan 5 2024
TypeScriptにコントロールフロー解析を諦めさせる方法

```ts
declare const __tag: unique symbol;

interface Array<T> {
    includes(searchElement: unknown, fromIndex?: number): searchElement is T & {[__tag]: never};
}

function checkNarrowing(val: "hoge" | "piyo" | "fuga") {
    const dummy: ("hoge" | "piyo")[] = [];
    if (dummy.includes(val)) {
           val;
        // ^?
    } else {
           val;
        // ^?
    }
}
```

さて、突然ですが問題です。`else`節内部における`val`の型は何でしょう？

1. `"fuga"`
1. `"hoge" | "piyo" | "fuga"`

答えは…2です！

なぜかはわかりませんが、TypeScriptはこのような

* union type `X`と
* `X`のスーパータイプでもサブタイプでもない型`Y`の

intersection type `X & Y` を見ると`X`についてnarrowingを諦めるようです。

上記の例では、`Y` を `null` だとか `undefined` だとかにしても同じです。
ですが、これが正しい、あるいは保障されている方法なのかは全く分かりません。
Score-based Source Separation with Applications to Digital Communication Signals

# 1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/8d1e5964-c76e-67c9-61cd-b4b48a18f17f.png)

この論文では、拡散ベースの生成モデル(diffusion model)を用いた複数の信号の分離技術を提案している。例えば、身の回りにはゲーム機やスマートフォン、ルーターやドローンなどあらゆる電波を発する機器があるが、受信機から見ると信号は複数の波が重なって見える。そこで、独立な信号源に対して拡散モデルで学習済みの統計的な事前確率(statistical priors)のみを利用して、それぞれの機器の信号の事後確率を予測することで、計算コストのかかる混合信号の学習を不要にしている。
提案手法は、無線周波数(RF:radio-frequency)システムへの応用を想定しており、ビットエラー率(BER:bit error rate)をなるべく少なくしながらエンコード後のビットから基底となる離散的な性質を持つ信号源を復元することで混合信号の分離に成功している。無線周波数の混合信号に対する分離実験では、従来の学習ベースの手法と比較してビットエラー率を95%低減できることを示している。

---

# 2. 新規性
- 学習済みの事前確率のみを用いており、混合信号自体からの学習は必要としない。
- 離散的な信号源の復元に適しており、無線周波数(RF)などの分野で応用が可能。
- 既存手法と比較して、符号化ビットの復元において著しく高い性能を達成した。

---

# 3. 実現方法
1. 独立な信号源ごとに事前確率を拡散モデルで生成させる。
独立な信号源ごとの事前確率として学習済みの拡散モデルを利用しており、事前確率の学習を個別にチューニングする必要が無いようにしている。また、拡散モデルにおける訓練時のノイズスケジュールをそのまま再利用しており、ハイパーパラメータの細かい調整を必要とせず、学習率のみを微調整するだけでよいようにしている。

2. 混合信号に対して複数のランダムなのガウス平滑化(Gaussian smoothing)を適用する。
ガウス平滑化を入力源の混合信号に対して適用することで、ロバスト性を向上させており様々な信号に対して分離できるようにしている。

3. α-posterior estimationを用いて事後分布のパラメータ推定を行う
事後確率として個別の信号源を推定することで、混合信号から分離を行う。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/9c3d5386-2211-f383-47fa-2cb1fbaf0c4c.png)

ビットエラー率(BER)と平均二乗誤差(MSE)を用いて評価を行っており、提案手法であるα-RGS(Randomized Gaussian Smoothing)は、特にビットエラー率(BER)において従来の学習ベースの手法を大きく上回る95%低減を実現している。

---

Paper URL: <https://openreview.net/forum?id=BFGQQKicuu>

last updates: Apr. 18 2024
DPOK: Reinforcement Learning for Fine-tuning Text-to-Image Diffusion Models

# 1. 概要

この研究では、テキストから画像を生成する際のクオリティを人間のフィードバックを受けることによって向上させる方法を提案している。人間のフィードバックは、テキストからの画像生成モデルの性能向上に寄与することが知られているが、従来の手法では、まず人間が何を望んでいるかを抽出し表現するための報酬関数(reward function)を学習し、その報酬関数に基づいてモデルを改善させていた。しかし、単純に報酬のスコアに基づく棄却サンプリングなどのアプローチが適用されてきたが、生成モデルのファインチューニングには依然として課題が残っていた。
本論文では、オンライン強化学習(online reinforcement learning)を用いたテキストからの画像生成におけるモデルのファインチューニングを提案している。特に、拡散モデル(diffusion models)に着目しており、ファインチューニングのタスクを強化学習問題として定式化している。事前学習されたモデルをポリシー勾配法(policy gradient)を用いてフィードバックで学習した報酬を最大化することで更新している。

---

# 2. 新規性
- オンライン強化学習を用いてテキストから画像生成モデルをファインチューニングする方法を提案している。
- テキストから画像生成モデルのファインチューニングするタスクを、強化学習の問題として定式化している。
- ポリシー勾配法を用いた、人間のフィードバックに基づく報酬関数によるモデル更新手法を提案している。
---

# 3. 実現方法
提案手法は、DPOK(Diffusion POlicy KL regulation)と呼ばれ、ポリシー最適化とKL最適化を統合している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/096d756b-2296-3e1f-ee28-9c1a3adf91c3.png)

1. 事前学習されたテキストから画像生成を行うモデルを用いて、人間が望ましい画像生成を表現する報酬関数を学習する。
2. テキストから画像生成モデルをファインチューニングを強化学習問題として定式化する。
3. ポリシー勾配法を用いて、報酬関数を最大化することでモデルを更新する。
4. KL正則化を組み込み、モデルの更新を安定させる。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/ca41ba0b-d854-4a5c-c399-8e237d5e1fa2.png)


強化学習によるファインチューニングと教師有りのファインチューニングについて、KL正則化の効果を分析している。実験では、提案手法が画像とテキストの一致度と画像品質の両方について、教師有りのファインチューニングよりも優れていることを示した。

---

Paper URL: <https://openreview.net/forum?id=8OTPepXzeh&noteId=gDVthccGwl>

last updates: Apr. 18 2024
In-Context Learning Unlocked for Diffusion Models

# 1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/368c8a8e-f7c8-4fe3-66f8-0930fe024d3e.png)

この論文では、拡散モデル(diffusion models)を応用して与えられたテキスト情報に合わせて画像を生成する、「コンテキスト学習」を実現する新しいフレームワークとしてプロンプト拡散手法(Prompt Diffusion)を提案している。コンテキスト学習(in-context learning)とは、与えられた情報(コンテキスト)を基に、モデルが新しいタスクを学習・実行できるようにすることを指す。
プロンプト拡散手法では、未知の画像変換タスクに対しても画像の事例とテキストによる指示で高品質な画像を生成することができる。特に、学習済みのタスクに対して高品質な画像生成を行うだけでなく、新しいタスクに対しても対応するプロンプトを与えることで適応することができるよう拡張されている。

*Spotlight Poster

---

# 2. 新規性
従来の拡散モデル(diffusion models)では、例えば、ボケた画像から鮮明な画像を復元するなど、特定のタスクに対してのみ学習されていた。提案手法である「プロンプト拡散手法」では、テキストによるガイダンスを用いて、モデルが新しいタスクを理解して実行できるようにしている。


---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/6783725c-b5c9-8ff0-96fd-aff88899269f.png)

- Visual-Launguage Prompt: テキスト形式でタスクの内容を表現する。例えば、「深度画像(depth map)から通常の画像に変換する」や「落書き画像(scribble)から詳細な画像に変換」といったタスクを入力することで、プロンプト拡散手法では変換手法のタスクを理解することができる。
- Diffusion Models: 複数のタスクに対して、それぞれに対応するVisual-Language Promptを用いて学習されている。プロンプトは、拡散モデルの生成結果を望ましい画像に誘導するようガイダンスとして機能する。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/b893fd90-63b0-5448-cf1f-93ae89bacb3b.png)

深度画像(depth map)や画像のエッジマップ(edge map)や分割マップ(segmentation map)を入力にして、未知の深度画像やエッジマップや分割マップから画像のスタイルを事例のように反映して編集し画像を自動生成することができている。事例となるペアを入力するため、ドメイン内タスク(In-Domain Tasks)と呼ばれる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/ccca0e54-c811-85b4-487d-646104aaba9f.png)

テキスト内に変換の指示を記載する場合、事前に学習されたドメインと異なる表現であっても、入力の事例を基に生成することができる。これを学習外のドメインタスク(Out-of-Domain Tasks)と呼んでいる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/fb4cd8a3-1fd7-f3c9-e1d9-b03eaae58782.png)

同じ画像の異なるコンテキスト情報を入力として、画像編集をすることができる。

---

Paper URL: <https://openreview.net/forum?id=6BZS2EAkns>

last updates: Apr. 18 2024
A Data-Free Approach to Mitigate Catastrophic Forgetting in Federated Class Incremental Learning for Vision Tasks

# 1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/0dee7664-53fc-d737-e3e3-c730cf40a37d.png)

端末に分散したデータを活用してモデルを学習する手法のことを連邦学習(Federated Learning)と呼び、プライバシー保護が重視されるユースケースで用いられる。ディープラーニングのモデルは新たなデータを学習する際に、以前学習した情報を忘れてしまう破滅的忘却(Catastrophic Forgetting)という課題が指摘されているが、この論文では連邦学習における忘却防止のための生成AIのモデルを提案している。特に、データを各端末で分散して学習する連邦学習の場合、破壊的忘却がより顕著になることが知られていた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/2fba2fcb-0647-9d1c-24cc-2c8200b8ed48.png)

従来、中央集権型の学習環境では忘却防止手法がいくつか提案されていたが、プライバシー保護や端末リソースの制約など連邦学習特有の制約のため、そのまま適用できなかった。
提案手法では、連邦クラス漸進学習(Federated Class Incremental Learning)を提案しており、生成モデルを活用して過去の学習対象だったデータの分布を模倣して、新しいデータと組み合わせて忘却防止を図っている。クラス漸進学習 (class incremental learning)とは、少しずつ新しいクラスのデータを学習に加え、忘却を防止する手法のことを指す。

---

# 2. 新規性
- 生成モデルを活用して、過去の学習対象データを模して忘却防止を実演する手法を提案している。
- 連邦学習(Federated Learning)におけるプライバシー保護に配慮した生成モデルの訓練方法を提案している。
- ユーザーが過去のデータやモデルを保持しなくても参加できる柔軟な手法を提案している。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/1aa34659-3694-1e84-94c3-5fed8d35ab15.png)

1. 生成モデルを訓練して、過去の学習対象データを模倣したサンプルを生成する。
2. 生成されたサンプルを新しい学習データと組み合わせて、モデルを更新する。
3. 生成モデルは、各端末からデータを収集することなく、プライバシーを保護しつつサーバー側で訓練を行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/c70c40f3-89b1-5dae-96e7-7e28c1d31158.png)

4. ユーザーは過去のデータやモデルを保持する必要が無く、自由に学習への参加/離脱が可能となる。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/679701a0-b22a-6bf0-212d-b2d4d067c2be.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/6db2a61f-21f1-ea05-47e7-f878b7ab0243.png)

従来手法と比較して、忘却防止性能が向上していることを、複数のデータセットを用いた実験で確認している。なお、評価には学習タスク間に重複タスクが無く、モデルは今まで学習したすべてのクラスに対して評価されるようにしている。これによって、クラス漸進学習(class incremental learning)の評価が可能となっている。

---

Paper URL: <https://openreview.net/forum?id=3b9sqxCW1x>

last updates: Apr. 18 2024
gzipファイルがダウンロード時に勝手に展開されてしまう怪奇現象（しかも、拡張子が.gzのまま......）

# ことの発端

とあるテスト中の顧客から、「ファイルのインポートができない」と問い合わせがありました。
インポート処理は顧客のサーバに配置されたgzipファイルをダウンロードしてからインポートするというもの。

エラーメッセージを見ると、`gzip以外の形式で圧縮されているファイル`とのことで、
これは、内部でgzipファイルを展開する際に`Zlib::GzipFile::Error`が出た場合に出るメッセージです。

しかし、実際に配置されているファイルをcurlでダウンロードすると普通にgzipファイルでした。fileコマンドの結果もちゃんとgzipです。
gzip展開するコードにも特に変な箇所は見当たりません。ただ単にextractを実行しているだけのコードです。
```ruby
def extract(content)
  FileIo::Archive::Gzip.extract(str: content)
```

なんでgzip展開でエラーが出ているのかわからない......

## おかしな点に気づく

顧客ファイルをブラウザ上で閲覧すると（テスト時だったので、公開しても特に問題ないファイルを使用していました）、平文で中身が見えてしまいます。
gzip圧縮されたファイルならばバイナリ列が表示されるはずではないのでしょうか？

まるで、**ブラウザで表示するとき、勝手にgzip圧縮を展開しているかのような......**

## まさか本当に？

調べてみると、以下のようなページがヒットしました。

* [Firehose で S3 に保存したgzipファイルが正常に解凍出来ない問題の対処方法](https://dev.classmethod.jp/articles/tsnote-firehose-s3-unzip-001/)
* [RubyのNet::HTTPにおけるHTTP Compressionサポート](https://qiita.com/vzvu3k6k/items/f82e3b06f06d7fa03014)

要約すると、
* アップロードする際に、**レスポンスヘッダに`Content-Encoding: gzip`を付与するように設定**されている
* ダウンロード側が**Http Compression有効**

という二つの条件が噛み合うと、「拡張子が.gzのままなのに展開済みのファイルがダウンロードされる」のです🥶!!

HTTP Compressionについては、Net::HTTPを使用している場合はバージョン2.0以降は必ず有効になっているそうです。また、Chromeとかのメジャーなブラウザは有効みたいです。
実際、弊社のシステムではHTTPダウンロードをFaradayで実装しており、
デフォルトであるNet::HTTPアダプターを使用していました。

## 解決編

さて、この問題を解決する方法を考えなくてはなりません。
いくつか案を挙げてみました。

### 1.HTTP Compressionを無効化してダウンロードする

Accept-Encodingが設定されていない場合にNet::HTTPが自動でgzipファイルをAcceptするよう設定してしまうのが原因なので、
Accept-Encodingをidentityで上書きしてしまえばよいかと考えました。
* 参考：https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Accept-Encoding

この設定でダウンロードしたところ、見事gzipファイルとして保存されました。

#### 問題点
この方法だと、元々の`accept-encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3`を上書きするので、仮にZlibのdeflateを受け付けている場合にはおそらく不具合になります。

弊システムでは、gzipを推奨しているものの、圧縮方式を縛っていませんでした。他の顧客に影響が出てしまいますね......

### 2.gzip展開に失敗したら「実は展開済みかどうか」を確認する

考えてみれば、展開後のファイルをダウンロードしたとて、ファイルの中身がインポート可能なのであれば問題がありません。
なので、いったん展開処理にかけてみて、エラーが出た場合に「拡張子`.gz`だけど実は生のインポート可能ファイルですか？」という確認を入れることにします。

これならば、**今までの処理を変えないで後ろに処理を付け足す形になるので、これまで上手くいっていた顧客には影響がありません。**

ということで、今回は2.の方法を採用しました。

### ちなみに

展開前にファイル形式を判定すればよいのでは？とも思ったのですが、
それでは結局「gzip圧縮したファイルを渡しているのにgzipファイルではないとエラーになる！」という問い合わせ自体は解決できません。
ついでに、他のうまくいっている顧客もすべて通るルートになってしまうため、影響が出てしまう可能性があります。
というわけで没になりました。

# まとめ

* `Content-Encoding: gzip`が付与されているとgzip圧縮が展開された状態でダウンロードされる場合がある
* 特例の顧客に対応するための変更は、他の顧客が通るルートとは別に処理を付け足す形での修正を検討しよう

まとめるとたった2行になってしまいましたが、僕自身が答えに辿り着くまでは結構時間がかかったので、
どこかの誰かの助けになればいいなと思って書かせていただきました。
それではまた！
QLoRA: Efficient Finetuning of Quantized LLMs

# 1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/19b33973-3a28-a13f-7c44-cdca8039c36e.png)

大規模言語モデル(LLM)のファインチューニングを行う方法としてLow-Rank Adaptation(LoRA)が知られており、モデルのすべての重みを更新するのではなく、小さな行列を使って学習に必要なメモリや計算量を削減できるため、Parameter-Efficient Fine-Tuning(PEFT)の代表手法としてよく用いられる。
この研究では、QLoRAと呼ばれる新しいファインチューニングを提案しており、従来の16ビットのファインチューニングと同等性能を維持しながら、メモリ使用量を大幅に削減することで、650億パラメータのモデルを48GBのGPU1つでファインチューニングすることに成功している。

*Oral Paper

---

# 2. 新規性
従来のファインチューニング手法では、モデルの膨大な重みを全て更新する必要があったが、QLoRAでは重みを量子化して圧縮し、LoRAを用いて小さな行列を用いてファインチューニングを行う。新規性として特に以下が挙げられる。

- 4 bit Normal Float(NF4): 正規分布に従う重み表現に最適化された新しいデータフォーマットを提案している。
- 二重量子化(Doubled Quantization): 量子化定数を量子化することで、さらにメモリ使用量を削減した。
- ページ分割最適化(Paged Optimizers): メモリ使用量の一時的な急増に対処する手法を提案している。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/346027b1-56a2-da44-4e32-ba5b25c7e80a.png)

1. 事前に学習済みの言語モデルの重みを4ビットに量子化し圧縮する。
2. 量子化された重みは固定し、ファインチューニングはLoRAを用いて実行する。
3. LoRA を更新することで、モデルの性能を向上させる。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/8ad7bca6-92ec-de82-82e8-e05fd2421cc1.png)

提案手法のQLoRAを用いて、LLaMaやT5など様々な規模の言語モデルに対して、1000を超えるモデルでファインチューニングを実施して性能評価を行っている。その結果、従来手法ではファインチューニングが困難だった大規模モデル(330億パラメータ～650億パラメータ)に対して、大幅にメモリ使用量を削減することでファインチューニングを可能にした。
また、少量の高品質なデータセットを用いた提案手法によるファインチューニングでは、SOTAモデルと同等以上の性能を実現している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/f4bb61bb-76a1-3e36-9089-80ea2649439e.png)

さらに、QLoRAを用いて24時間でGPU1つだけでファインチューニングされた4ビットチャットボット(Guanaco)について評価をしたところ、人間による評価とGPT-4による評価の結果が類似しており、GPT-4による性能評価は人間による評価の代替え手段として有効としている。また、現行のチャットボットのベンチマークは必ずしも信頼できない可能性を示唆している。GuanacoがChatGPTに比べて劣っている点についても分析がなされている。

---

Paper URL: <https://openreview.net/forum?id=OUIFPHEgJU>

last updates: Apr. 24 2024
Solving Inverse Physics Problems with Score Matching

# 1. 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/33c1fb33-4074-c16a-167d-158ce50b153f.png)

ある時点の物理系の状態から過去の状態を推定する手法のことをInverse Physics Simulationと呼ぶ。従来のシミュレーションでは、初期の状態から未来の物理現象を予測していたが、この手法ではその逆のプロセスを行う。例えば、流体可視化の例では、現在観測された流体の各パーティクルの位置に対して、時間を逆にしてどのような位置にあったかを予測することで、観測時間よりも前の状態を予測することができる。この論文では、拡散モデル(diffusion model)が徐々にノイズを除去して過去の状態を予測することを利用して、物理シミュレーションに転用した。

---

# 2. 新規性
従来手法(Inverse Physics Simulation)には、精度や安定性に課題があった。この論文では以下の改善を行っている。

- 段階的逆シミュレーション：物理系の状態を、時間ごとに少しずつさかのぼって推定することで、より正確で時間的に安定した予測を実現している。
- 学習による補正機能：シミュレーションの誤差を補正する機能を拡散モデル(diffusion model)で訓練している。
- 解の分布サンプリング機能：複数の解の可能性を考慮した推定が可能になった。

---

# 3. 実現方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/15df54be-10b9-2659-22bd-170cd83bd70e.png)

1. 物理系の現在の状態を観測する。
2. 常微分方程式(SDE)の物理モデルベースのシミュレーターを使って、少し前の状態を推定する。
3. 拡散モデルで訓練された補正機能を使って、シミュレーターの誤差を補正する。ここで、Heat Diffusion(熱拡散)方程式を取り入れており、時間とともに情報が失われるような拡散過程を表現し、物理シミュレーションの軌跡にノイズを加えることで失われた詳細を再現できるようにしている。
さらに、障害物のあるケースに対応するために、Buoyancy-driven Flow(浮力駆動流)を導入しており学習されたスコア関数が未知の状況に対して適切な過去の状態を推定できる汎化性を持てるようにしている。特に、非線形な物理現象やランダムな障害物などを含む複雑な系に対して対応できるようにしている。
4. 1-3 の手順を繰り返して、さらに過去の状態を推定する。

---

# 4. 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/f2ac0409-f593-909a-5cd2-9e0ba9e5be33.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/115207ea-a88b-3766-51e6-2894081cd93a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/aab29cf5-21ba-45c0-78ec-866e8ed9abe8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/b60412fb-1c64-49e6-11aa-0bbbd6c4f927.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158742/6c8df4eb-11c2-358d-cf11-d3612893f12b.png)

従来の物理シミュレーションベースの手法や拡散モデルベースのものと比較実験をしており、提案手法の方が現在観測された流体情報から過去を予測するときの再構成誤差が最も少ない結果となった。

---

Paper URL: <https://openreview.net/pdf?id=2BpoGPSDCR>

last updates: Apr. 25 2024
Nextプロジェクト作成からMaterial UI導入まで

## Nextプロジェクトの作成
https://nextjs.org/docs/getting-started/installation

#### 1. 以下のコマンドを実行する
```bash
npx create-next-app@latest
```
    
#### 2. それぞれの質問に答えて、プロジェクトを設定する
```
% npx create-next-app@latest
Need to install the following packages:
create-next-app@14.2.5
Ok to proceed? (y) y
```
![Nextプロジェクトの作成手順 スクリーンショット 2024-07-17 19.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461384/678f019a-4fc5-b29b-b12f-97c073954871.png)

    
各質問の内容:
    
- **What is your project named?**: プロジェクトの名前を入力します（例: `next-app`）。
- **Would you like to use TypeScript?**: TypeScript を使用するかどうかを選択します（`No` または `Yes`）。
- **Would you like to use ESLint?**: ESLint を使用するかどうかを選択します（`No` または `Yes`）。
- **Would you like to use Tailwind CSS?**: Tailwind CSS を使用するかどうかを選択します（`No` または `Yes`）。
- **Would you like to use `src/` directory?**: `src/` ディレクトリを使用するかどうかを選択します（`No` または `Yes`）。
- **Would you like to use App Router? (recommended)**: App Router を使用するかどうかを選択します（`No` または `Yes`）。
- **Would you like to customize the default import alias (@/*)?**: デフォルトのインポートエイリアスをカスタマイズするかどうかを選択します（`No` または `Yes`）。
- **What import alias would you like configured?**: インポートエイリアスを設定します（例: `@/*`）。


#### 3. 作成されたフォルダの確認
![Nextプロジェクトの作成手順 スクリーンショット 2024-07-17 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461384/89ab2313-f16a-a79d-ec97-70a7e777e040.png)


#### 4. サーバーを起動する
```
npm run dev
```
#### 5. ブラウザにアクセスする

以下の画面のようにNext.js アプリケーションが表示されます。

![スクリーンショット 2024-07-17 19.24.39 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461384/e25738bc-9361-abc7-0114-3e8229ae0415.png)

## Material UIを導入する
Next.js ([App Router](https://nextjs.org/docs/app))と Material UI の統合についての手順をまとめます。以下のドキュメントをもとに進めていきました。


https://mui.com/material-ui/integrations/nextjs

#### 1. 依存関係をインストールする
```jsx
npm i @mui/material-nextjs @emotion/cache
```
@mui/materialが既にインストールされていることを確認してください。されていない場合は、以下のコマンドでmuiをインストールしてください。
```jsx
npm install @mui/material @emotion/react @emotion/styled
```

#### 2. layout.tsxを書き換える

`app/layout.tsx` でを`AppRouterCacheProvider`インポートし、 `<body>`の下にあるすべての要素をラップします。

```jsx
import type { Metadata } from "next";
import { Inter } from "next/font/google";
import "./globals.css";
import { AppRouterCacheProvider } from "@mui/material-nextjs/v14-appRouter";

const inter = Inter({ subsets: ["latin"] });

export const metadata: Metadata = {
  title: "Create Next App",
  description: "Generated by create next app",
};

export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  return (
    <html lang="en">
      <body className={inter.className}>
        <AppRouterCacheProvider>{children}</AppRouterCacheProvider>
      </body>
    </html>
  );
}

```
これでMaterial UIが使えるようになります！