산업용 로봇
수년에 걸쳐 우리는 많은 분야와 산업에서 인공 지능(AI)의 힘을 활용하여 연구의 한계를 뛰어 넘는 것을 보았습니다. 데이터 압축 및 재구성도 예외는 아니며 인공 지능을 적용하여 보다 강력한 시스템을 구축할 수 있습니다.
이 기사에서는 데이터를 압축하고 자동 인코더로 압축된 데이터를 재구성하는 AI의 매우 인기 있는 사용 사례를 살펴보겠습니다.
Autoencoder는 기계 학습 분야에서 많은 사람들의 관심을 받았으며, 이는 autoencoder의 개선과 여러 변형의 발명을 통해 분명해졌습니다. 그들은 신경 기계 번역, 약물 발견, 이미지 노이즈 제거 및 기타 여러 분야에서 (최신은 아닐지라도) 유망한 결과를 산출했습니다.
대부분의 신경망과 마찬가지로 자동 인코더는 기울기를 뒤로 전파하여 가중치 집합을 최적화하는 방식으로 학습하지만 자동 인코더 아키텍처와 대부분의 신경망 아키텍처 간의 가장 두드러진 차이점은 병목 현상입니다. 이 병목 현상은 데이터를 더 낮은 차원의 표현으로 압축하는 수단입니다. 자동 인코더의 다른 두 가지 중요한 부분은 인코더와 디코더입니다.
이 세 가지 구성 요소를 함께 결합하면 "바닐라" 자동 인코더가 형성되지만 더 정교한 구성 요소에는 몇 가지 추가 구성 요소가 있을 수 있습니다.
이러한 구성 요소를 개별적으로 살펴보겠습니다.
이것은 데이터 압축 및 재구성의 첫 번째 단계이며 실제로 데이터 압축 단계를 처리합니다. 인코더는 데이터 특징(예:이미지 압축의 경우 픽셀)을 받아들이고 데이터 특징의 크기보다 작은 크기의 잠재 벡터를 출력하는 피드포워드 신경망입니다.
데이터의 재구성을 견고하게 하기 위해 인코더는 입력 데이터 표현의 가장 중요한 특징을 작은 크기의 잠재 벡터로 압축하도록 훈련 중에 가중치를 최적화합니다. 이렇게 하면 디코더가 입력 데이터에 대한 충분한 정보를 확보하여 손실을 최소화하면서 데이터를 재구성할 수 있습니다.
자동 인코더의 병목 현상 또는 잠재 벡터 구성 요소는 가장 중요한 부분이며 크기를 선택해야 할 때 더욱 중요해집니다.
인코더의 출력은 잠재 벡터를 제공하며 입력 데이터의 가장 중요한 특징 표현을 보유해야 합니다. 또한 디코더 부분에 대한 입력 역할을 하며 재구성을 위해 디코더에 유용한 표현을 전파합니다.
잠재 벡터에 대해 더 작은 크기를 선택하면 입력 데이터에 대한 더 적은 정보로 입력 데이터 기능을 표시할 수 있습니다. 훨씬 더 큰 잠재 벡터 크기를 선택하면 자동 인코더를 사용한 압축에 대한 전체 아이디어가 경시되고 계산 비용도 증가합니다.
이 단계에서는 데이터 압축 및 재구성 프로세스를 마칩니다. 인코더와 마찬가지로 이 구성 요소도 피드포워드 신경망이지만 인코더와 구조적으로 약간 다릅니다. 이 차이는 디코더가 디코더의 출력보다 작은 크기의 잠재 벡터를 입력으로 받는다는 사실에서 비롯됩니다.
디코더의 기능은 입력에 매우 가까운 잠재 벡터에서 출력을 생성하는 것입니다.
일반적으로 오토인코더를 훈련할 때 이러한 구성 요소를 독립적으로 구축하는 대신 함께 구축합니다. 우리는 경사하강법 또는 ADAM 옵티마이저와 같은 최적화 알고리즘을 사용하여 종단 간 교육을 실시합니다.
논의할 가치가 있는 오토인코더 훈련 절차의 한 부분은 손실 함수입니다. 데이터 재구성은 생성 작업이며 올바른 클래스를 예측할 확률을 최대화하는 것이 목표인 다른 기계 학습 작업과 달리 입력에 가까운 출력을 생성하도록 네트워크를 구동합니다.
l1, l2, 평균 제곱 오차 및 기타 몇 가지와 같은 여러 손실 함수를 사용하여 이 목표를 달성할 수 있습니다. 이러한 손실 함수의 공통점은 입력과 출력 간의 차이(즉, 얼마나 멀리 또는 동일한지)를 측정하여 둘 중 하나를 적절한 선택으로 만든다는 것입니다.
그동안 우리는 인코더와 디코더를 모두 설계하기 위해 다층 퍼셉트론을 사용해 왔지만 CNN(컨볼루션 신경망)과 같은 보다 전문화된 프레임워크를 사용하여 이미지 데이터 압축의 경우.
놀랍게도, 연구에 따르면 텍스트 데이터의 자동 인코더로 사용되는 순환 네트워크가 매우 잘 작동하지만 이 기사의 범위에서는 이에 대해 다루지 않을 것입니다. 다중 계층 퍼셉트론에서 사용되는 인코더-잠재 벡터-디코더의 개념은 여전히 컨볼루션 자동 인코더에 적용됩니다. 유일한 차이점은 디코더와 인코더를 컨볼루션 레이어로 설계한다는 것입니다.
이러한 모든 자동 인코더 네트워크는 압축 작업에 매우 적합하지만 한 가지 문제가 있습니다.
우리가 논의한 네트워크는 창의성이 전혀 없습니다. 창의성이 0이라는 말은 그들이 보거나 훈련을 받은 결과만 생성할 수 있다는 것입니다.
아키텍처 디자인을 약간 조정하여 창의성을 어느 정도 유도할 수 있습니다. 결과는 변형 자동 인코더로 알려져 있습니다.
Variational autoencoder는 두 가지 주요 설계 변경 사항을 도입합니다.
<울>Variational autoencoder 뒤에 있는 아이디어는 디코더가 인코더에 의해 생성된 평균 벡터와 분산 벡터에 의해 매개변수화된 분포에서 샘플링된 잠재 벡터를 사용하여 데이터를 재구성하기를 원한다는 것입니다.
분포에서 샘플링 기능은 디코더에 생성할 제어된 공간을 부여합니다. Variational Autoencoder를 훈련시킨 후 입력 데이터로 순방향 전달을 수행할 때마다 인코더는 잠재 벡터를 샘플링할 분포를 결정하는 평균 및 분산 벡터를 생성합니다.
평균 벡터는 입력 데이터의 인코딩이 중심이 되어야 하는 위치를 결정하고 분산은 실제 출력을 생성하기 위해 인코딩을 선택하려는 방사형 공간 또는 원을 결정합니다. 즉, 동일한 입력 데이터를 사용하는 모든 정방향 패스에서 Variational Autoencoder는 평균 벡터를 중심으로 분산 공간 내에서 다양한 출력 변형을 생성할 수 있습니다.
비교를 위해 표준 자동 인코더를 볼 때 네트워크가 훈련되지 않은 출력을 생성하려고 하면 인코더가 생성하는 잠재 벡터 공간의 불연속성으로 인해 비현실적인 출력이 생성됩니다.
이제 Variational Autoencoder를 직관적으로 이해했으므로 TensorFlow에서 빌드하는 방법을 살펴보겠습니다.
데이터 세트를 준비하여 예제를 시작하겠습니다. 편의상 MNIST 데이터세트를 사용하겠습니다.
(train_images, _), (test_images, _) =tf.keras.datasets.mnist.load_data()
train_images =train_images.reshape(train_images.shape[0], 28, 28, 1).astype('float32')
test_images =test_images.reshape(test_images.shape[0], 28, 28, 1).astype('float32')
# 이미지를 [0., 1.] 범위로 정규화
train_images /=255.
테스트_이미지 /=255.
# 이진화
기차 이미지[기차 이미지>=.5] =1.
기차 이미지[기차 이미지 <.5] =0.
test_images[test_images>=.5] =1.
테스트_이미지[테스트_이미지 <.5] =0.
TRAIN_BUF =60000
배치_크기 =100
TEST_BUF =10000
train_dataset =tf.data.Dataset.from_tensor_slices(train_images).shuffle(TRAIN_BUF).batch(BATCH_SIZE)
test_dataset =tf.data.Dataset.from_tensor_slices(test_images).shuffle(TEST_BUF).batch(BATCH_SIZE)
데이터 세트를 얻고 작업을 위해 준비합니다.
클래스 CVAE(tf.keras.Model):
def __init__(self, latent_dim):
super(CVAE, self).__init__()
self.latent_dim =latent_dim
<코드> self.inference_net =tf.keras.Sequential(
<코드> [
<코드> tf.keras.layers.InputLayer(input_shape=(28, 28, 1)),
<코드> tf.keras.layers.Conv2D(
필터=32, kernel_size=3, strides=(2, 2), 활성화='relu'),
<코드> tf.keras.layers.Conv2D(
필터=64, kernel_size=3, strides=(2, 2), 활성화='relu'),
tf.keras.layers.Flatten(),
# 활성화되지 않음
tf.keras.layers.Dense(latent_dim + latent_dim),
<코드> ]
<코드> )
<코드> self.generative_net =tf.keras.Sequential(
<코드> [
<코드> tf.keras.layers.InputLayer(input_shape=(latent_dim,)),
<코드> tf.keras.layers.Dense(단위=7*7*32, 활성화=tf.nn.relu),
<코드> tf.keras.layers.Reshape(target_shape=(7, 7, 32)),
tf.keras.layers.Conv2DTranspose(
필터=64,
kernel_size=3,
strides=(2, 2),
패딩="SAME",
활성화='relu'),
tf.keras.layers.Conv2DTranspose(
필터=32,
kernel_size=3,
strides=(2, 2),
패딩="SAME",
활성화='relu'),
# 활성화되지 않음
tf.keras.layers.Conv2DTranspose(
필터=1, kernel_size=3, strides=(1, 1), padding="SAME"),
<코드> ]
<코드> )
@tf.function
def 샘플(self, eps=None):
eps가 None인 경우:
<코드> eps =tf.random.normal(shape=(100, self.latent_dim))
return self.decode(eps, apply_sigmoid=True)
def encode(self, x):
평균, logvar =tf.split(self.inference_net(x), num_or_size_splits=2, axis=1)
반환 평균, logvar
def reparameterize(self, mean, logvar):
<코드> eps =tf.random.normal(shape=mean.shape)
return eps * tf.exp(logvar * .5) + 평균
def 디코드(self, z, apply_sigmoid=False):
logits =self.generative_net(z)
apply_sigmoid인 경우:
probs =tf.sigmoid(logits)
반환 확률
반환 로그
두 개의 코드 조각은 데이터 세트를 준비하고 변형 자동 인코더 모델을 빌드합니다. 모델 코드 스니펫에는 인코딩, 샘플링 및 디코딩을 수행하는 몇 가지 도우미 함수가 있습니다.
우리가 논의하지 않았지만 우리의 Variational Autoencoder 네트워크에서 매우 중요한 문제를 해결하는 재매개변수화 기능이 있습니다. 디코딩 단계에서 인코더에 의해 생성된 평균 및 분산 벡터에 의해 제어되는 분포에서 잠재 벡터 인코딩을 샘플링한다는 것을 상기하십시오. 이것은 네트워크를 통해 데이터를 전달하는 데 문제가 되지 않지만 샘플링 작업은 미분할 수 없기 때문에 디코더에서 인코더로 기울기를 역전파할 때는 큰 문제를 일으킵니다.
간단히 말해서 샘플링 작업에서 기울기를 계산할 수 없습니다.
이 문제에 대한 좋은 해결 방법은 다시 매개변수화 트릭을 적용하는 것입니다. 이것은 먼저 평균 0과 분산 1의 표준 가우스 분포를 생성한 다음 인코더에 의해 생성된 평균과 분산으로 이 분포에 대해 미분 가능한 덧셈 및 곱셈 연산을 수행하여 작동합니다.
코드에서 분산을 로그 공간으로 변환하는 것에 주목하십시오. 이는 수치적 안정성을 보장하기 위한 것입니다. 추가적인 손실 항인 Kullback-Leibler divergence loss가 도입되어 우리가 생성하는 분포가 가능한 평균이 0이고 분산이 1인 표준 가우스 분포에 가깝습니다.
분포의 평균을 0으로 설정하면 분포 간의 불연속성을 방지하기 위해 생성된 분포가 서로 매우 가깝습니다. 분산이 1에 가까우면 인코딩을 생성할 더 적당한(매우 크지도 않고 작지도 않은) 공간이 있음을 의미합니다.
재매개변수화 트릭을 수행한 후 분산 벡터에 표준 가우스 분포를 곱하고 그 결과를 평균 벡터에 더한 분포는 평균 및 분산 벡터에 의해 즉시 제어되는 분포와 매우 유사합니다.
변형 자동 인코더를 구축하는 단계를 요약하여 이 자습서를 마무리하겠습니다.
<올>위에 사용된 전체 코드는 공식 TensorFlow 웹사이트에서 찾을 수 있습니다.
Chiman Kwan이 수정한 주요 이미지
산업용 로봇
자동차 산업 전반에 걸쳐 전기 자동차 제조 프로세스를 개선할 필요가 있습니다. 전기 자동차에 대한 수요가 계속 기하급수적으로 증가함에 따라 제조업체는 공정 개선이 단순히 좋은 것이 아닌 상황에 처해 있습니다. 그것들은 이제 필수적입니다. Nature의 최근 기사에 따르면 배터리와 자동차 제조업체는 이미 제조 비용 절감에 수십억 달러를 지출하고 있습니다. 자동차 제조업체라면 감당할 수 없습니다. 가능한 경우 프로세스에 로봇 자동화를 추가합니다. 당신의 경쟁자들은 이미 그것을 하고 있습니다! 전기 자동차 제조는 다른 자동차와
판금 굽힘은 시간이 많이 걸리고 비효율적인 작업입니다. 판금을 더 효과적으로 구부리는 방법은 무엇입니까? 공정에 로봇을 추가하는 것은 판금 절곡 공정의 효율성과 생산성을 향상시키는 완벽한 솔루션이 될 수 있습니다. 또한 날카로운 금속으로 인한 절단, 청력 손상을 유발하는 시끄러운 기계 및 기타 부상과 같이 수동으로 작업을 수행할 때 잠재적인 위험을 크게 줄입니다. 하지만 자동화된 판금 벤딩이 귀하의 비즈니스에 적합한 솔루션입니까? 자동 판금 절곡기가 필요하십니까? 판금으로 작업하는 경우 굽힘이 핵심 작업일 것입니다. 다양한