Open njs03332 opened 1 year ago
assign roles -s 0420 -c 13.3 13.3.1 13.3.2
0 | 1 | 2 | |
---|---|---|---|
member | 한단비 | 주선미 | 김유리 |
chapter | 13.3 | 13.3.1 | 13.3.2 |
# 임베딩 헹렬(Embedding Matrix)을 만들어 초기화
embedding_dim = 2 # 이 값은 하이퍼파라미터로 튜닝
embed_init = tf.random.uniform([len(vocab) + num_oov_buckets, embedding_dim])
embedding_matrix = tf.Variable(embed_init)
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
- 딥러닝 알고리즘에 공정성을 부여하는 것은 중요하고 활발히 연구되는 주제
# 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은 전체 훈련세트일 필요는 없음
vocab = ['<1H OCEAN', 'INLAND', 'ISLAND', 'NEAR BAY', 'NEAR OCEAN']
indices = tf.range(len(vocab), dtype=tf.int64)
table_init = tf.lookup.KeyValueTensorInitializer(vocab, indices)
num_oov_buckets = 2 # oov index는 2개 5,6
table = tf.lookup.StaticVocabularyTable(table_init, num_oov_buckets)
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)>
4/27 목요일 21:30