njs03332 / ml_study

3 stars 0 forks source link

2023/04/20 ~ 2023/04/27 #66

Open njs03332 opened 1 year ago

njs03332 commented 1 year ago

4/27 목요일 21:30

njs03332 commented 1 year ago

assign roles -s 0420 -c 13.3 13.3.1 13.3.2

njs03332 commented 1 year ago
0 1 2
member 한단비 주선미 김유리
chapter 13.3 13.3.1 13.3.2
njs03332 commented 1 year ago

13.3.2 임베딩을 사용해 범주형 특성 인코딩하기

embedding_matrix <tf.Variable 'Variable:0' shape=(7, 2) dtype=float32, numpy= array([[0.5749372 , 0.19900596], [0.7038239 , 0.05541027], [0.5884645 , 0.5430788 ], [0.9185413 , 0.37144518], [0.84554374, 0.9902985 ], [0.27800095, 0.5500362 ], [0.43682623, 0.68426645]], dtype=float32)>

동일한 범주 특성을 인코딩

categorise = tf.constant(["NEAR BAY", "DESERT", "INLAND", "INLAND"]) cat_indices = table.lookup(categories)

cat_indices <tf.Tensor: shape=(4,), dtype=int64, numpy=array([3, 5, 1, 1], dtype=int64)>

tf.nn.embedding_lookup(embedding_matrix, cat_indices) <tf.Tensor: shape=(4, 2), dtype=float32, numpy= array([[0.9185413 , 0.37144518], [0.27800095, 0.5500362 ], [0.7038239 , 0.05541027], [0.7038239 , 0.05541027]], dtype=float32)>

- `tf.nn.embedding_lookup()` : 임베딩 행렬에서 주어진 인덱스에 해당하는 행을 찾음
- 케라스는 기본적으로 학습 가능한 임베딩 행렬을 처리해주는 `keras.layers.Embedding` 층을 제공
- 이 층이 생성될 때 임베딩 행렬을 랜덤하게 초기화하고 어떤 범주 인덱스로 호출될 때 임베딩 행렬에 있는 그 인덱스의 행을 반환
```python
# 모두 연결하면 범주형 특성을 처리하고 각 범주마다 임베딩을 학습하는 케라스 모델
regular_inputs = keras.layers.Input(shape=[8])
categories = keras.layers.Input(shape=[], dtype=tf.string)
cat_indices = keras.layers.Lambda(lambda cats: table.lookup(cats))(categories)
cat_embed = keras.layers.Embedding(input_dim = 6, output_dim=2)(cat_indices)
encoded_inputs = keras.layers.concatenate([regular_inputs, cat_embed])
outputs = keras.layers.Dense(1)(encoded_inputs)
model = keras.models.Model(inputs=[regular_inputs, categories], outputs=[outputs])
  • 두 개의 입력을 받음
  • 8개의 특성을 담은 입력, 하나의 범주형 입력
  • Lambda 층을 사용해 범주의 인덱스를 찾은 다음 임베딩에서 이 인덱스를 찾음
  • 이 임베딩과 일반 입력을 연결하여 신경망에 주입할 인코드된 입력을 만듦
  • 간단하게 완전 연결 층을 하나 추가하여 케라스 모델을 만듦
  • keras.layers.TextVectorization 층을 사용할 수 있다면 adapt() 메서드를 호출하여 샘플 데이터에서 어휘 사전을 추출함 -> 이 층을 모델에 추가하여 인덱스 룩업을 수행 (Lambda 층을 대신함)
  • 원핫-인코딩 다음에 뒤따르는 Dense 층이 Embedding 층과 동등한 역할을 하나 Embedding 층이 더 적은 연산을 사용함
  • Dense 층의 가중치 행렬이 임베딩 행렬의 역할을 수행
  • Embedding 층의 임베딩 차원을 뒤따르는 층의 유닛 개수보다 더 많이 사용하는 것은 낭비
  • 단어 임베딩
  • 일반적으로 임베딩은 다른 작업에도 성공적으로 재사용될 수 있음
  • 자연어 처리 작업에서도 직접 단어 임베딩 훈련하는 것보다 사전훈련된 임베딩을 재사용하는 것이 나은 경우가 많음
  • 2013년 토마시 미콜로프와 연구원들이 신경망을 사용해 단어 임베딩을 효과적으로 학습하는 방법을 발표
  • 성능 향상, 대량의 텍스트 데이터에서 임베딩 학습
  • 비슷한 말은 임베딩이 매우 비슷하고 의미가 관련된 단어들은 군집을 이룸
  • 단어 임베딩은 어떤 의미가 있는 축을 따라 임베딩 공간 안에서 조직됨
  • King-Man+Woman = Queen <- 성별의 개념을 인코딩
  • 단어 임베딩은 이따금 크게 편향됨
  • 예) Man-Doctor+Woman = Nurse
  • 딥러닝 알고리즘에 공정성을 부여하는 것은 중요하고 활발히 연구되는 주제
danbi5228 commented 1 year ago

13.3 입력 특성 전처리


# Lambda 층을 사용해 표준화를 수행하는 층 구현
means = np.mean(X_train, axis=0, keepdims=True)
stds = np.stds(X_train, axis=0, keepdims=True)
eps = keras.backend.epsilon() # 0으로 나눗셈되는 것을 피하기 위해 작은 수를 더해줌
model = keras.models.Sequential([
    keras.layers.Lambda(lambda inputs: (inputs - means) / (std + eps)),
    ... # 다른층
])

# means, stds와 같은 전역 변수를 사용하지 않은 층 구현. 일반적인 층처럼 사용 가능
class Standardization(keras.layers.Layer):
    def adapt(self, data_sample):
        self.means_ = np.mean(data_sample, axis=0, keepdims=True)
        self.std_ = np.stds(data_sample, axis=0, keepdims=True)

    def call(self, inputs):
        return (inputs - self.means_) / (self.std_ + keras.backend.epsilon())

std_layer = Standardization()
std_layer.adapt(data_sample) # 층을 모델에 추가하기 전에 adapt 메서드 호출. data_sample은 전체 훈련세트일 필요는 없음
givitallugot commented 1 year ago

13.3.1 원-핫 벡터를 사용해 범주형 특성 인코딩하기

oov 버킷을 사용하는 이유?

# lookup table을 사용하여 몇 개의 범주 특성을 원-핫 벡터로 인코딩

categories = tf.constant(["NEAR BAY", "DESERT", "INLAND", "INLAND"])
cat_indices = table.lookup(categories)
cat_indices
cat_one_hot = tf.one_hot(cat_indices, depth=len(vocab) + num_oov_buckets)
cat_one_hot
<tf.Tensor: shape=(4, 7), dtype=float32, numpy=
array([[ 0.,  0., 0., 1., 0., 0.,  0.],
           [ 0.,  0., 0., 0., 0., 1.,  0.],
           [ 0.,  1., 0., 0., 0., 0.,  0.],
           [ 0.,  1., 0., 0., 0., 0.,  0.]], dtype=float32)>