Processing math: 100%

1. 논문 소개

'Very Deep Convolutional Networks for Large-Scale Image Recognition'

Karen Simonyan, Andrew Zisserman (ICLR 2015)

 

 

(1) Abstract

- Convolution network 깊이가 large-scale image recognition에 미치는 영향에 대한 연구를 진행함

- 매우 작은 convolution filters (3 x 3)16 ~ 19 layers 아키텍처를 구성하여 상당한 성능 개선을 이룸

- 2014년 ILSVRC에서 1, 2위를 차지함

- 다른 데이터셋에서도 잘 일반화되어 sota 결과를 얻을 수 있었음

 

 

(2) Introduction

- ConvNet이 컴퓨터 비전 분야에서의 성능 향상에 도모하는 바가 커지면서, 2012년 AlexNet의 성능을 뛰어넘기 위한 노력을 많이 하고 있음

- 본 논문에서는 'depth'에 집중하기로 함. convolutional layer를 추가함으로써 점차 깊이를 증가시켜나간다.

 

 

(3) ConvNet Configurations

1) Architecture

- input : 224 x 224 RGB image (학습 데이터의 평균으로 빼주기)

 

- kernel : 3 x 3, stride : 1, padding : 1

- MaxPooling : 2 x 2, stride : 2

 

- FC layers : 4096 channels 2개, 마지막엔 1000-way (softmax layer)

- ReLU 사용

- LRN 사용 안 함 (오히려 그런 normalization이 성능 향상에 도움이 안 되었고, 메모리 소모와 연산 시간만 늘렸다고 함)

 

 

2) Configuration

Table 1 : conv<kernel 크기>-<채널 개수>

- 깊이 11 (8 conv, 3 FC) ~ 깊이 19 (16 conv, 3 FC)

 

- 깊이에 따른 파라미터 개수인데, 크게 차이나지 않음

 

- VGG16 구조 도식화

 

 

 

3) Discussion

- VGGNet은 이전의 ILSVRC 대회에서 우수한 성능을 보인 모델들과의 상당한 차이가 있음

- 첫번째 conv layer뿐만 아니라 전체 네트워크에 걸쳐 3 x 3의 매우 작은 receptive field를 사용한다.

 

- 작은 receptive field을 사용하는 것의 이점?

1) 작은 kernel을 여러 개 사용하는 것과 큰 kernel 한 개를 사용하는 것이 동일한 크기의 피처맵을 얻을 수 있음

2) decision function을 더 discriminative하게 만들 수 있음

3) 더 적은 파라미터가 필요함

 

 

예) 2개의 3 x 3 커널을 사용하는 것과 1개의 5 x 5 커널은 동일한 크기의 피처맵 생성!

 

입력 채널, 출력 채널 모두 C개라고 가정하면,

- 2개의 3 x 3 커널 : 2 * (3 * 3 * C * C) = 18C*C

- 1개의 5 x 5 커널 : (5 * 5 * C * C) = 25C * C

 

2개의 3 x 3 커널의 파라미터보다 1개의 5 x 5 커널의 파라미터 개수가 더 많다.

 

- 1 x 1 conv. layers 사용 : receptive field에 영향을 주지 않으면서, non-linearity 증가시키기 위해서 사용 (by. ReLU)

 

- GoogLeNet도 small convolutional filters (1 x 1, 5 x 5, 3 x 3)를 사용했다는 점이 유사하지만, VGGNet 보다 훨씬 복잡하여 계산량이 어마어마하다.

 

 

 

(4) Classification Framework

1) Training

- Mini batch gradient descent (batch size : 256, momentum : 0.9)

- L2 regularization : 5104

- Dropout : 0.5

- 초기 learning rate : 102 → validation score 개선 없는 경우 10배 감소시킴 (총 3회 감소)

 

- 네트워크 가중치의 초기화가 중요하므로, 얕은 모델부터 학습 시작하고, 학습 중에 레이어가 변경될 수 있도록 했음

- Random Initialization은 정규 분포 상에서 weight를 샘플링했음 (평균 0, 표준편차 102)

 

 

2) Testing

- 입력 이미지의 크기에서 training scale을 S, testing scale을 Q라고 했을 때, 둘이 서로 같을 필요는 없음

- input image 크기에 따라 variable spatial resolution을 출력하기 때문에, class score map을 'sum-pooled'을 통해 spatially average 한다.

 

 


 

2. Summary

- 네트워크의 깊이와 모델 성능 영향에 집중

- Convolution 커널 사이즈를 3 x 3으로 고정

- 커널 사이즈가 크면 이미지 사이즈 축소가 급격하게 이뤄져서 더 깊은 층을 만들기 어렵고, 파라미터 개수와 연산량도 더 많이 필요

- 여러 개의 3X3 Convolution 연산을 수행하는 것이 더 뛰어난 Feature 추출 효과를 나타냄

 

- 개별 Block내에서는 동일한 커널 크기와 Channel 개수를 적용하여 동일한 크기의 feature map들을 생성

- 이전 Block 내에 있는 Feature Map 대비 새로운 Block내에 Feature Map 크기는 2배로 줄어 들지만 채널 수는 2배로 늘어남 (맨 마지막 block 제외)

https://pub.towardsai.net/the-architecture-and-implementation-of-vgg-16-b050e5a5920b

 

 


 

3. Code

!pip install torchsummary

import numpy as np
import pandas as pd
import os
import matplotlib.pyplot as plt

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

from torch.utils.data import DataLoader, Dataset, random_split
from torch.utils.data import random_split

from torchsummary import summary

import torchvision
from torchvision.utils import make_grid
import torchvision.transforms as tr

from tqdm import trange
# mean
tr_meanRGB = [ np.mean(x.numpy(), axis=(1, 2)) for x, _ in cifar10_tr ]

tr_meanR = np.mean([m[0] for m in tr_meanRGB])
tr_meanG = np.mean([m[1] for m in tr_meanRGB])
tr_meanB = np.mean([m[2] for m in tr_meanRGB])

# std
tr_stdRGB = [ np.std(x.numpy(), axis=(1, 2)) for x, _ in cifar10_tr ]

tr_stdR = np.std([m[0] for m in tr_stdRGB])
tr_stdG = np.std([m[1] for m in tr_stdRGB])
tr_stdB = np.std([m[2] for m in tr_stdRGB])

mean = [tr_meanR, tr_meanG, tr_meanB]
std = [tr_stdR, tr_stdG, tr_stdB]


tr_transform = tr.Compose([
    tr.ToTensor(),
    tr.Resize(128),  # 크기 조정
    tr.RandomHorizontalFlip(p=0.7), 
    tr.Normalize(mean=[0.49139965, 0.48215845, 0.4465309], std=[0.060528398, 0.061124973, 0.06764512])
])

te_transform = tr.Compose([
    tr.ToTensor(),
    tr.Resize(128),  # 크기 조정
    tr.Normalize(mean=[0.49139965, 0.48215845, 0.4465309], std=[0.060528398, 0.061124973, 0.06764512])
])

tr_meanRGB, tr_stdRGB 값을 구해서 이후에는 직접 Normalize에 넣어주는 방식으로 진행했음.

 

torch.manual_seed(11)

cifar10_tr = torchvision.datasets.CIFAR10(root='./data', download=True, train=True, transform=tr_transform)

val_size = 10000
train_size = len(cifar10_tr) - val_size
cifar10_tr, cifar10_val = random_split(cifar10_tr, [train_size, val_size])

cifar10_te = torchvision.datasets.CIFAR10(root='./data', download=True, train=False, transform=te_transform)

train 데이터를 train, valid로 나누어주었고, random_split을 사용했음

 

trainloader = DataLoader(cifar10_tr, batch_size=64, shuffle=True)
valloader = DataLoader(cifar10_val, batch_size=64, shuffle=False)
testloader = DataLoader(cifar10_te, batch_size=64, shuffle=False)

train, valid, test 데이터셋을 데이터로더로 넣어주고,

 

 

시각화

for images, _ in trainloader:
    print('images.shape:', images.shape)
    
    plt.figure(figsize=(16,8))
    plt.axis('off')
    plt.imshow(make_grid(images, nrow=16).permute((1, 2, 0)))
    
    break

 

데이터 확인

images, labels = next(iter(trainloader))
print(labels)
print(images.shape, labels.shape)

 

 

VGGNet 모델 구현

device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')

class VGGNet(nn.Module):
    
    def __init__(self, n_classes=10):
        super().__init__()
        
        self.conv1 = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2, 2)
        )
        
        self.conv2 = nn.Sequential(
            nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.Conv2d(128, 128, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2, 2)
        )
        
        self.conv3 = nn.Sequential(
            nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2, 2)
        )
        
        self.conv4 = nn.Sequential(
            nn.Conv2d(256, 512, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2, 2)
        )
        
        self.conv5 = nn.Sequential(
            nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2, 2)
        )
        
        self.fc6 = nn.Sequential(
            nn.Dropout(0.5),
            nn.Linear(512*4*4, 4096),
            nn.ReLU(),
        )
        
        self.fc7 = nn.Sequential(
            nn.Dropout(0.5),
            nn.Linear(4096,4096),
            nn.ReLU(),
        )
        
        self.fc8 = nn.Sequential(
            nn.Linear(4096, n_classes),
        )
    
    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = self.conv3(x)
        x = self.conv4(x)
        x = self.conv5(x)
        x = x.view(x.size(0), -1)
        x = self.fc6(x)
        x = self.fc7(x)
        x = self.fc8(x)
        
        return x

 

 

학습 준비

model = VGGNet().to(device)
criterion = nn.CrossEntropyLoss()

optimizer = optim.Adam(model.parameters(), lr=1e-3, weight_decay=1e-4)
scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=5, verbose=True)

# early stopping
early_stopping_epochs = 5
best_loss = float('inf')
early_stop_counter = 0

summary(model, input_size=(3, 128, 128))

PyTorch에서는 early stopping을 제공하고 있지 않기 때문에, 직접 구현해주었음

 

 

학습

epochs = 30

for epoch in range(epochs):
    model.train()
    train_loss, correct, total = 0.0, 0, 0
    
    # Train
    for data in trainloader:
        images, labels = data[0].to(device), data[1].to(device)
        
        outputs = model(images)
        
        optimizer.zero_grad()
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        train_loss += loss.item()
        predicted = torch.argmax(outputs, 1)
        
        total += labels.size()[0]
        correct += (predicted == labels).sum().item()
        
    print(f'Epoch [{epoch+1}/{epochs}] || Loss:{train_loss / len(trainloader)} || Accuracy:{100 * correct / total}')


    
    # Valid
    model.eval()
    valid_loss = 0.0
    
    for data in valloader:
        images, labels = data[0].to(device), data[1].to(device)
        outputs = model(images)
        loss = criterion(outputs, labels)
        valid_loss += loss.item()
    
    if valid_loss > best_loss:
        early_stop_counter += 1
    else:
        best_loss = valid_loss
        early_stop_counter = 0
    
    if early_stop_counter >= early_stopping_epochs:
        print("Early Stopping!")
        break

 

 

Test

correct, total = 0, 0

with torch.no_grad():
    model.eval()
    test_loss = 0.0
    
    for data in testloader:
        images, labels = data[0].to(device), data[1].to(device)
        outputs = model(images)
        test_loss += loss.item()
        
        _, predicted = torch.max(outputs.data, axis=1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()
        
print(f"Test loss : {test_loss / len(testloader)}")
print(f"Accuracy : {correct / total:.2f}")

LG Aimers에서 연세대학교 정승환 교수님 강의를 듣고 정리한 내용입니다.

틀린 부분이 있다면 댓글 부탁드립니다!

 


 

1. 품질의 정의

품질은 10개의 성질로 정의할 수 있다.

 

(1) 품질의 10가지 성질

- 고객 만족도 : 제품 출시를 앞두고 철저한 사용자 조사를 통해 기능 반영, 높은 만족도 달성

- 일관성 : 동일한 품질의 부품을 만들고, 모든 제품이 동일한 성능과 신뢰성을 유지

- 적합성 : 목적에 적합해야 함. 냉장고는 냉장 기능에 최적화 되어야 함

- 신뢰성 : 제품의 내구성을 높이기 위해 반복적으로 테스트와 개선 작업을 함

- 성능 : 소비자들의 요구를 반영하여 고성능 제품을 개발함

- 안정성 : 품질 검사를 통해 안전하고 믿을 수 있는 제품을 제공함

- 지속 가능성 : 기업, 사회, 환경적 지속 가능한 품질 관리에 앞장섬

- 효율성 : 사용자의 피드백을 반영하여 사용 편의성을 높이고, 처리 속도를 개선함

- 유지 보수성 : 유지 보수가 용이하도록 설계하며, 오랜 기간 동안 품질을 유지함

- 혁신 : 혁신적인 제품을 지속적으로 개발하고 경쟁력을 유지함

 

 

(2) 품질 관리 성공 사례 - SAMSUNG

- 첨단 기술 활용 : AI와 머신러닝을 활용한 자동 검사 시스템, IoT를 통한 예측, 유지보수 등을 도입하여 품질 문제를 사전에 예방함

- 전사적 품질 관리 문화 : 모든 직원이 품질 향상에 기여하도록 하는 문화를 구축하여, 전반적인 품질 관리 수준을 높임

- Six Sigma 도입 : 삼성은 1990년대부터 Six Sigma를 도입하여 공급망 관리를 혁신하고, 제품 결함을 줄여 운영 효율성을 극대화함

- 지속적인 개선 노력: 고객 불만 분석, 루트 원인 분석, 성과 지표 추적 등을 통해 지속적으로 품질을 개선해 옴

 


 

2. 품질 경영의 발전 과정

(1) 산업혁명과 초기 변화

- 산업 혁명은 대규모 분업을 초래하였고, 작업자들은 제품의 일부분만 담당

- 효율성은 증가했지만, 작업자들이 최종 제품을 확인하기 어려워짐에 따라 품질에 대한 책임이 작업조장에게 넘어감

- 초기 품질 검사는 비계획적이고 불완전하게 수행되어, 품질을 떨어뜨리는 결과를 낳음

 

 

(2) 2차 세계대전과 품질관리의 진전

- 2차 세계대전의 영향으로, 품질 관리의 중요성이 증대되었음. 전쟁 중 군수 물자 납품을 빠른 속도로 해야했기 때문

- 샘플링 검사법을 도입하며 품질 보증의 기초를 마련함

- 1950년대 중반에는 품질관리의 영역이 제조 과정에서 제품 설계, 원자재 입고 과정까지 확대됨

- 제품의 전체 라이프사이클을 고려한 품질관리가 시작되었음

 

 

(3) 전략적 접근과 현대적 의미

- 1970년대 후반에는 품질보증에서 전략적 품질경영으로 변화함

- 품질이 기업의 장기적인 성공에 필수적 요소로 인식되었음

- 품질은 기업 이익에 직접적인 영향을 미치며, 전사적 노력이 필요함.

 


 

3. 품질 표준

(1) ISO 9000 국제 품질 표준

https://ko.wikipedia.org/wiki/ISO_9000

- 국제적 인정 : ISO 9000 시리즈는 전 세계적으로 인정받는 품질 관리 표준임

- 품질관리 절차 : ISO 표준은 품질 관리 절차, 세부 문서, 작업 지침, 기록 유지 장려

- ISO 9001:2015 : 최신 버전은 다른 관리 시스템과의 호환성을 높이는 구조를 따름. risk-based thinking을 강조함

- 글로벌 인증 : 전 세계 201개 국가에서 160만 개 이상의 인증을 받은 글로벌 경영에 필수적인 표준임

 

 

(2) ISO 9000 관리 원칙

- 최고 경영진의 리더십

- 고객 만족

- 지속적인 개선 (PDCA, Plan Do Check Act)

- 전 조직 구성원의 참여

- 프로세스 접근법

- 데이터 기반 의사결정

- 시스템적 접근방식

- 상호 이익 공급 관계

 

 

(3) 말콤 볼드리지 국가 품질상

- 1988년 미국 정부에 의해 제정됨 : 당시 미국 경제상황은 제 2차 세계대전으로 인해 최악의 상태였음. 한편, 일본의 경제 및 상품경쟁력은 전성기를 맞고 있었는데, 이에 대해 미국은 일본의 경쟁력에 대해 다방면으로 검토

 

- Total Quality Management (TQM) 실행을 향상시키기 위해 설계됨

- 국가적 차원의 품질상이 필요함을 인식하고 성과 우수성을 달성한 조직을 인정함

 

 

(4) 볼드리지 지표 (Baldridge Criteria)

- 리더십 (120점) + 전략 (85점) + 고객 중심 (85점) + 측정, 분석, 지식 경영 (90점) + 고용 (85점) + 운영 (85점)

- 종합적으로 평가되어 조직의 품질 관리 성과를 판단함

 


 

4. 품질 비용

- 목표는 적은 비용으로 높은 품질 얻기!

 

(1) 품질 비용의 구성요소

- 평가 비용 (Appraisal Costs) : 품질 검사, 테스트 장비 비용 등

- 예방 비용 (Prevention Costs) : 직원 교육, 품질 개선 프로그램, 유지보수 비용 등

- 내부 실패 비용 (Internal Failure Costs) : 재작업 비용, 폐기 비용 등

- 외부 실패 비용 (External Failure Costs) : 고객 불만 처리 비용, 제품 반환 및 교체 비용 등

 

 

(2) 품질 비용의 관리 방법

- 평가 비용 : 효율적인 검사 및 테스트 프로세스 도입. 자동화된 검사 시스템 도입으로 오류 최소화

- 예방 비용 : 품질 교육 및 훈련 프로그램을 통해 직원의 품질 인식 향상. 품질 개선 프로젝트를 통해 결함 발생 가능성 감소

- 내부 실패 비용 : 결함 발생 시 신속한 문제 해결과 재작업으로 비용 최소화. 원인 분석을 통해 재발 방지 대책 마련

- 외부 실패 비용 : 고객 피드백 시스템을 통해 문제를 조기에 발견하고 해결. 제품 보증 및 애프터 서비스 강화로 고객 신뢰 유지

 


 

5. 품질의 리더

1. 논문 소개

'ImageNet Classification with Deep Convolutional Neural Networks'

Alex Krizhevsky, Ilya Sutskever, Geoffrey E. Hinton (NIPS 2012)

 

 

(1) Abstract

- ILSVRC(ImageNet Large-Scale Visual Recognition Challenge)-2010 : 120만 개의 고해상도 이미지를 1000개의 서로 다른 class로 분류하는 대회

 

- 테스트 데이터에서 top-1, top-5 error rates가 각각 37.5%, 17.0%를 기록하며, 기존의 sota보다 훨씬 우수한 결과를 얻었다.

(top-5 error rate란 모델이 예측한 최상위 5개 범주 가운데 정답이 없는 경우의 오류율이다.)

 

- 6,000만 개의 파라미터, 65만 개의 뉴런으로 신경망을 구성하였으며, 5개의 convolutional layers, 그 중에서 일부는 max pooling layer를 가진다. 마지막에 1000-way softmax fully connected layers 3개로 구성되어 있다.

 

- 훈련 속도를 높이기 위해 non-saturating neurons를 사용하였으며, GPU로 구현하였다.

 

- Fully connected layers에서 overfitting을 줄이기 위해 'Dropout'이라는 정규화 방법을 사용하였고, 이는 매우 효과적이었다.

 

- Dropout을 적용한 모델은 ILSVRC-2012 대회에서 top-5 test error rate를 15.3%를 달성하였는데, 이는 2위 error rate인 26.2%와의 간격이 매우 큰 결과이다.

https://medium.com/coinmonks/paper-review-of-alexnet-caffenet-winner-in-ilsvrc-2012-image-classification-b93598314160

 

 

 

 

(2) Introduction

- 현재 object recognition에서는 machine learning 방법을 많이 사용하고 있다. 이러한 object recognition 성능을 높이기 위해서는 1) larger dataset이 필요하며, 2) more powerful model을 학습시키고, 3) overfitting을 방지하기 위한 기술을 사용해야 한다.

 

- 이전까지의 label의 개수는 그래봤자 10개 남짓이었다. 이러한 simple recognition task에서는 적은 양의 데이터셋과 label-preserving transformation을 통한 augmentation으로도 충분한 인간 정도의 성능을 보였다.

 

- 대규모 데이터셋 (수백만 장의 이미지와 수천개의 objects)을 학습하기 위한 모델로, CNN을 제안한다.

standard feedforward neural networks에 비교했을 때, connections, parameters가 적기 때문에 훈련이 더 쉽다.

 

- CNN의 장점에도 불구하고, high resolution (고해상도) images에 대규모로 적용하기에는 비용이 많이 든다.

따라서, 'highly-optimized GPU implementation of 2D convolution'를 활용하여 매우 큰 deep learning CNN을 학습할 수 있도록 한다.

 

- 5개의 convolutional, 3개의 fully-connected layers를 가지고 있다. (이 중 하나의 레이어만 제거하더라도 떨어지는 성능이 나온다.)

 

 

 

 

(3) The Dataset

1) ImageNet

- 1,500만 장의 labeled high-resolution images

- 약 22,000개의 카테고리

 

 

2) ILSVRC (실제 사용한 데이터셋)

- ImageNet의 subset을 데이터셋으로 사용

- 각 카테고리 별로 1,000개의 이미지가 포함된 총 1,000개의 카테고리

- 약 120만 장의 training images + 5만 장의 validation images + 15만 장의 testing images

https://oi.readthedocs.io/en/latest/computer_vision/conf&dataset.html

 

 

 

3) 데이터 전처리

- ImageNet은 variable-resolution images로 구성되어 있음 (각 이미지 별로 해상도 차이가 있음)

: 일정한 입력 차원을 받기 위해서 256 x 256의 fixed resolution으로 down-sampling 진행

 

- 각각의 픽셀에서 training set의 평균값을 빼어 centered raw RGB 값으로 모델 학습

 

 

 

 

(4) The architecture

1) ReLU Nonlinearity

- 일반적으로 tanh, sigmoid를 활성화 함수로 사용했었는데, gradient descent에서의 saturating 문제로 ReLU를 처음 사용하였음

https://bskyvision.com/421

 

- tanh에서는 출력값이 [-1, 1] 범위에서 존재하여, 논문에서 말하는 'saturating' 상태가 된다.

입력값이 ∞ 또는 -∞가 될수록 기울기가 0에 가까워져 weight 학습이 잘 되지 않는다.

 

- 반면, ReLU는 [0, ∞] 범위에서 존재하여, non-saturating 함수이다.

입력값이 ∞이더라도 기울기가 0이 아니라 빠르게 수렴된다.

 

saturating 정의

 

 

Figure 1

 

- 실선은 ReLU를 사용했을 때, 점선은 tanh를 사용했을 때 25%의 error rate에 도달하기까지의 epoch을 나타낸 그래프이다.

확실히 실선인 ReLU가 더 빠른 속도로 도달했음을 확인할 수 있다.

 

 

 

2) Training on Multiple GPUs

- GPU 한 개로는 모델의 최대 크기에 제한이 있기 때문에, 모델을 두 개의 GPU로 나눠준다.

- host machine memory 없이도 GPU 간의 메모리에서 직접 read, write가 가능하다.

 

- 병렬 GPU은 기본적으로 kernel의 절반을 각 GPU에 배치하고, 특정 layer에서만 communicate한다.

(layer 3는 두 GPU에서 모든 커널을 입력 받고, layer 4는 본인 GPU에서만 입력을 받음)

Figure 2의 일부

- 교차 검증을 통해 GPU 연결 패턴을 결정한다.

 

Figure 3

- 224 x 224 x 3 이미지를 kernel size=11로 학습하여 나온 결과인 96개의 결과이다.

위쪽의 48개의 결과는 GPU1, 아래쪽의 48개의 결과는 GPU2로 학습된 결과이다.

GPU1은 색상보다는 형태에, GPU2는 색상과 관련된 피처를 학습하고 있다는, 즉 독립적으로 학습한다는 것을 보여준다.

 

 

 

3) Local Response Normalization

- Local Response Normalization을 통해 generalization을 더 높인다. (현재는 Batch Normalization)

 

- ReLU를 활성화 함수로 사용했을 때, 양수 입력에 대해서는 그대로 내보내지만 음수 입력에 대해서는 0을 내보낸다.

이렇게 되면, 그 다음 계층에 큰 값이 전달되고, 주변의 작은 값들은 덜 전달되어 학습이 잘 이뤄지지 않는다.

 

- 이런 현상을 방지하기 위해 LRN이 사용되었다.

 

 

- aix,y : 픽셀 (x, y)에 커널 i를 적용한 결과

- bix,y : LRN 결과

- i : 현재 kernel

- N : 총 kernel 개수

- n : 이웃한 normalization 크기

 

n개의 이웃한 필터에서의 (x,y)의 결과를 제곱하여 더하면,

값이 클수록 원래 값보다 작게 만들어주고, 작을수록 원래 값보다 크게 만들어주는 normalization 작업인 것이다.

 

 

 

4) Overlapping Pooling

- 일반적으로 pooling은 겹치지 않게 하지만, AlexNet에서는 overlapping 해주었다. 

https://bskyvision.com/421

 

 

 

5) Overall Architecture

 

- 5개의 convolutional layers + 3개의 fully connected layers (1000-way softmax)

[ Input layer - Conv1 - MaxPool1 - Norm1 - Conv2 - MaxPool2 - Norm2 - Conv3 - Conv4 - Conv5 - MaxPool3 - FC1 - FC2 - Output layer ]

 

 

왼쪽은 가장 초기의 CNN 모델인 LeNet-5이며, 오른쪽은 AlexNet이다.

훨씬 더 복잡하고 커진 것을 알 수 있다.

 

(나중에 사람들이 다시 계산해보니 input layer에서 224 x 224가 아니라 227 x 227이 맞는 크기였다.)

 

 

 

 

(5) Reducing Overfitting

1) Data Augmentation

- overfitting을 막을 수 있는 가장 쉬운 방법은 label-preserving transformation을 활용한 dataset 확장이다.

 

- 본 논문에서 사용한 data augmentation 방법으로는 다음 두 가지가 있다.

: horizontal reflections (수평 반전), PCA를 활용한 RGB 픽셀 값 변화

 

- horizontal reflections

https://learnopencv.com/understanding-alexnet/

 

 

- PCA 활용한 RGB 픽셀값 변경

: 각 RGB 이미지 픽셀 벡터 [IRxy,IGxy,IBxy]에 대해서, 모든 이미지 픽셀에 대해 공분산 행렬을 계산한다.

고유값 λi은 RGB 공간의 주성분을 나타내고, 고유벡터 pi은 각 성분의 분산을 나타낸다.

 

 

각 픽셀에 위의 값을 더해서, 주성분 방향으로 픽셀 값을 랜덤하게 변형한다.

 

 

2) Dropout

 

- 확률 0.5로 특정 hidden neuron의 출력값을 0으로 만들어준다.

- 순전파, 역전파 전달이 되지 않으므로 입력이 주어질 때마다 다른 아키텍처를 샘플링하는 것과 동일한 효과를 낸다. 즉, 여러 모델이 가중치를 학습하는 앙상블과 동일한 것이다!

 

 

 

(6) Results

- ILSVRC2010 test set의 Top-1 error rate, Top-5 error rate 결과이다.

Table 1

 

 

- ILSVRC-2012 validation and test sets에서의 Top-1 error rate, Top-5 error rate 결과이다.

(*는 2011 ImageNet으로 pretrained model)

Table 2

 

 


 

2. Summary

- Activation 함수로 ReLU 함수를 첫 사용

- MaxPooling 으로 Pooling 적용 및 Overlapping Pooling 적용

- Local Response Normalization (LRN) 사용

- Overfitting을 개선하기 위해서 Drop out Layer와 Weight의 Decay 기법 적용

- Data Augmentation 적용 (좌우 반전, Crop, PCA 변환 등)

 

https://unerue.github.io/computer-vision/classifier-alexnet.html

 

- 11x11, 5x5 사이즈의 큰 사이즈의 Kernel 적용. 이후 3x3 Kernel을 3번 이어서 적용

- Receptive Field가 큰 사이즈를 초기 Feature map에 적용하는 것이 보다 많은 feature 정보를 만드는데 효율적이라고 판단

- 하지만 많은 weight parameter 갯수로 인하여 컴퓨팅 연산량이 크게 증가 함. 이를 극복하기 위하여 병렬 GPU를 활용할 수 있도록 CNN 모델을 병렬화

 

 


 

 

3. Code

import numpy as np
import pandas as pd
import os

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

from torch.utils.data import DataLoader, Dataset, random_split
from torchsummary import summary

import torchvision
import torchvision.transforms as tr

from tqdm import trange

 

 

- 데이터 불러오기 (CIFAR10 데이터셋)

cifar10_tr = torchvision.datasets.CIFAR10(root='./data', download=True, train=True, transform=tr.Compose([tr.ToTensor()]))
cifar10_te = torchvision.datasets.CIFAR10(root='./data', download=True, train=False, transform=tr.Compose([tr.ToTensor()]))

meanRGB = [ np.mean(x.numpy(), axis=(1, 2)) for x, _ in cifar10_tr ]
stdRGB = [ np.std(x.numpy(), axis=(1, 2)) for x, _ in cifar10_tr ]

meanR = np.mean([m[0] for m in meanRGB])
meanG = np.mean([m[1] for m in meanRGB])
meanB = np.mean([m[2] for m in meanRGB])

stdR = np.mean([s[0] for s in stdRGB])
stdG = np.mean([s[1] for s in stdRGB])
stdB = np.mean([s[2] for s in stdRGB])

tr_transform = tr.Compose([
    tr.ToTensor(),
    tr.Resize(227),  # 크기 조정
    tr.RandomHorizontalFlip(),  # 좌우 반전
    tr.Normalize([meanR, meanG, meanB], [stdR, stdG, stdB])
])

te_transform = tr.Compose([
    tr.ToTensor(),
    tr.Resize(227),  # 크기 조정
    tr.Normalize([meanR, meanG, meanB], [stdR, stdG, stdB])
])

cifar10_tr.transform = tr_transform
cifar10_te.transform = te_transform

trainloader = DataLoader(cifar10_tr, batch_size=64, shuffle=True)
testloader = DataLoader(cifar10_te, batch_size=64, shuffle=False)

 

images, labels = next(iter(trainloader))
images.shape, labels.shape

(torch.Size([64, 3, 227, 227]), torch.Size([64])

 

 

- AlexNet

device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')

class AlexNet(nn.Module):

    def __init__(self, n_classes=10):
        super().__init__()

        self.conv1 = nn.Sequential(
            nn.Conv2d(3, 96, kernel_size=11, stride=4, padding='valid'),
            nn.ReLU(inplace=True),
            nn.LocalResponseNorm(size=5, alpha=0.0001, beta=0.75, k=2), 
            nn.MaxPool2d(kernel_size=3, stride=2),
        )

        self.conv2 = nn.Sequential(
            nn.Conv2d(96, 256, kernel_size=5, stride=1, padding='same'),
            nn.ReLU(inplace=True),
            nn.LocalResponseNorm(size=5, alpha=0.0001, beta=0.75, k=2),
            nn.MaxPool2d(kernel_size=3, stride=2),
        )

        self.conv3 = nn.Sequential(
            nn.Conv2d(256, 384, kernel_size=3, stride=1, padding='same'),
            nn.ReLU(inplace=True),
        )

        self.conv4 = nn.Sequential(
            nn.Conv2d(384, 384, kernel_size=3, stride=1, padding='same'),
            nn.ReLU(inplace=True),
        )

        self.conv5 = nn.Sequential(
            nn.Conv2d(384, 256, kernel_size=3, stride=1, padding='same'),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
        )

        self.fc6 = nn.Sequential(
            nn.Dropout(0.5),
            nn.Linear(256 * 6 * 6, 4096),
            nn.ReLU(inplace=True),
        )

        self.fc7 = nn.Sequential(
            nn.Dropout(0.5),
            nn.Linear(4096, 4096),
            nn.ReLU(),
        )

        self.fc8 = nn.Sequential(
            nn.Linear(4096, 10),

        )

    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = self.conv3(x)
        x = self.conv4(x)
        x = self.conv5(x)
        x = x.view(x.size(0), -1)

        x = self.fc6(x)
        x = self.fc7(x)
        x = self.fc8(x)

        return x
model = AlexNet().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=1e-3, weight_decay=1e-4)
scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.2, patience=5, verbose=True)
summary(model, input_size=(3, 227, 227), batch_size=64)

 

 

- Training

epochs = 20
l_ = []
pbar = trange(epochs)

for i in pbar:
    train_loss, correct, total, = 0.0, 0, 0

    for data in trainloader:
        images, labels = data[0].to(device), data[1].to(device)
        outputs = model(images)

        optimizer.zero_grad()
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        train_loss += loss.item()
        _, predicted = torch.max(outputs.detach(), 1)

        total += labels.size()[0]
        correct += (predicted == labels).sum().item()

    l = train_loss / len(trainloader)
    l_.append(l)
    acc = 100 * correct / total
    
    pbar.set_postfix({
        'loss' : l,
        'train acc' : acc
    })
    

print(l_)

 

성능이 잘 나오지 않아서 tr.Resize(128)로 바꿔서 진행했다. (cifar 데이터셋 이미지 크기가 32 x 32로 작은 편임)

그대신 아래와 같이 fc6을 바꿔줘야 한다.

self.fc6 = nn.Sequential(
            nn.Dropout(0.5),
            nn.Linear(1024, 4096),
            nn.ReLU(inplace=True),
        )

loss = 0.772, train accuracy : 74.3

 

 

- Testing

correct, total = 0, 0

with torch.no_grad():
    model.eval()
    test_loss = 0.0
    
    for data in testloader:
        images, labels = data[0].to(device), data[1].to(device)
        outputs = model(images)
        test_loss += loss.item()
        
        _, predicted = torch.max(outputs.data, axis=1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()
        
print(f"Test loss : {test_loss / len(testloader)}")
print(f"Accuracy : {correct / total:.2f}")

loss : 0.813, test accuracy : 71.80

 

LG Aimers에서 KAIST 신진우 교수님 강의를 듣고 정리한 내용입니다.

틀린 부분이 있다면 댓글 부탁드립니다!

 


 

1. Problem Setting

(1) Dimensionality Reduction

 

2차원 데이터가 있을때, x1과 x2 중에서 더 중요하다고 할 수 있는 데이터는 x1이다.

x1의 분산이 더 크기 때문이다.

 

이때, 차원을 축소하여 x1으로만 1차원으로 나타내어도, 데이터의 표현이 크게 달라지지 않는다.

 

 

고차원 데이터의 문제점으로는 다음과 같다.

- 분석 및 시각화의 어려움

- 가끔 overcomplete 되거나, 많은 차원들이 서로 중복되는 경우가 있음

 

compact data representation을 위해서 사용되는 대표적인 방법이 PCA (Principal Component Analysis, 주성분분석)이다.

 

예를 들어, 집값을 예측한다고 했을때 학습에 사용하는 피처를 5차원 (크기, 방 개수, 욕실 개수, 주변 상권, 범죄율)에서 2차원 (크기, 위치)으로 줄여 학습하면 더 효율적일 수 있다는 것이다.

 

 

 

(2) PCA Algorithm

 

1. 데이터의 평균으로 데이터를 빼서 원점 근처로 이동시킨다.

 

2. 데이터의 표준편차로 데이터를 나누어서 standardization 시킨다. 

이때, original data의 피처 차원은 D이다.

 

3. data의 covariance matrix (공분산 행렬)을 구하고, 행렬에 대해 M개의 largest eigen value를 구한다.

M은 차원 축소하고자 하는 차원으로 D >>> M 이다.

 

4. 3에서 구한 eigen vector로 정의된 공간으로 모든 데이터를 projection 한다.

 

5. projection한 데이터의 standardization, centering을 undo한다.

 

 

2차원 데이터를 PCA를 통해 1차원으로 차원 축소하는 과정이다.

 

 

 

(3) Data Matrix and Data Covariance Matrix

- N : sample 개수

- D : original data feature 개수

데이터 X (평균이 0)에 대해서 data matrix를 구하면 위와 같다.

 

이 데이터에 대해서 covariance matrix를 구해보면,

 

 

 

(4) Code : Low Dimensional Representation

데이터를 저차원 표현한 것을 code라고 부른다.

 

PCA 과정에서의 projection, subtraction, division은 모두 linear한 과정들이다.

이를 하나의 행렬 B로 linear transformation 했다고 한다면, 다음과 같이 나타낼 수 있다.

 

- x : 원본 데이터 (D차원)

- z : 변형 데이터 (M차원)

- B : 찾아야 할 행렬 (D x M차원), orthogonal matrix (B의 컬럼벡터들이 서로 수직이고 크기가 1)

 

결국, 행렬 B를 찾는 것이 PCA의 과정이다!

 

 

이를 Encoder와 Decoder의 관점에서 보면,

 

original data에 B를 곱해 코드 z를 만들고,

z에 B의 전치행렬을 곱하여 복원한다.

 

이때, B는 orthogonal matrix이므로 B의 전치행렬은 역행렬이다.

B의 전치행렬은 인코더, B는 디코더로 볼 수 있다.

 

예를 들어, MNIST 데이터셋에서 총 60,000개의 데이터가 있으며 (N = 60,000), 28 x 28 = 784 픽셀이 있을 때 (D = 784)

D를 2 또는 3차원으로 축소하여 데이터를 나타내는 것이 PCA, 즉 선형적 인코딩 과정인 것이다.

 

 

 

 

 

 

2. Maximum Variance perspective

(1) Idea

데이터 안의 '정보'란, 공간을 채우고 있는 것과 같다.

데이터가 얼마나 퍼저있는가 즉, 분산이 중요한 정보인 것이다.

 

 

X와 Y 중에서 더 중요한 피처는 X라고 말할 수 있는데, 그 이유는 분산이 더 크기 때문이다.

 

그러나, X와 Y 둘 중에서 하나만 골라서 사용하지 말고, 새로운 축을 구성하면 두 정보를 다 활용할 수 있다.

 

X, Y가 아닌 방향을 골라 그 방향으로 데이터를 projection하면서,

해당 방향으로의 분산이 최대가 될 수 있도록 한다면 데이터 활용이 더 커질 것이다.

 

 

 

(2) Matrix again

공분산 행렬의 고유벡터가 왜 데이터의 분산을 최대로 하는 방향인지에 대해 수학적으로 증명해본다.

 

- 목표 : 분산을 최대로 하는 orthogonal matrix B 찾기

- 결과 : 데이터의 공분산 행렬 S에 대한 M개의 고유값에 상응하는 고유벡터들은 행렬 B의 컬럼 벡터이다.

 

- 증명 방법 : 수학적 귀납법 (Induction)

 

1. n = 1

1차원 데이터에 대해 분산은 σ2이다.

공분산 행렬 S는 σ2 자체이며, 이 값이 고유값이다.

고유벡터는 1차원에서 단위 벡터 [1]이고, 행렬 B도 [1]이다.

 

1차원 데이터의 경우, 공분산 행렬의 고유벡터는 단순히 데이터의 방향을 나타내는 단위 벡터이다.

 

강의에서는 다음과 같은 방식으로 증명하였다.

 

 

코드 z의 분산을 구하는 식은 첫 번째 식과 같다. 그리고 z는 b1과 데이터 x의 선형 결합으로 나타낼 수 있다.

분산을 구해보면 두 번째 식처럼 나오고, 그 식을 최대로 하는 b1을 convex optimization으로 구한다.

 

convex optimization의 objective function과 constraint (정규화를 해서 데이터의 분산을 최대화하는데 영향을 미치지 않도록 한다.)는 다음과 같다.

 

라그랑주 함수는 다음과 같고, 이를 KKT condition으로 푼다.

 

라그랑주 함수에 대해 b1에 대한 편미분을 수행하고, 이를 0으로 설정하여 구해보면

Sb1=λ1b1

 

따라서, 분산을 최대로 하기 위해서는 가장 큰 고유값의 고유벡터를 주성분으로 삼아야 한다.

 

 

2. n = k-1일 때 가정

n = k-1 차원에서 행렬 B의 컬럼 벡터들이 공분산 행렬 S의 고유벡터들이며,

행렬 B가 데이터의 분산을 최대로 하는 orthogonal matrix임을 가정하자.

 

 

3. n= k

동일하게 optimization problem으로 표현할 수 있다.

 

라그랑주 함수는 다음과 같다.

 

라그랑지안의 첫 번째 필요 조건은 gradient = 0이 되는 것이므로,

 

이제 임의의 j{1,...,k}에 대해 다음을 만족해야 한다.

 

이때 bj는 S의 고유벡터이므로 Sbj=λjbj 이고 bTjbi=0을 만족한다. 따라서,

 

이로부터 bTjbk+1=0임을 알 수 있다.

 

식이 단순해지고 다음과 같이 표현된다.

따라서, bk+1은 S의 고유벡터이며, 고유값은 λ이다.

 

 

4. 고유값의 순서

우리는 k번째 고유벡터까지 알고 있다고 했을 때, bk+1k+1번째로 큰 고유값에 대응하는 고유벡터여야 한다.

그렇지 않으면, 고유값이 더 큰 고유벡터와의 직교 조건이 충족되지 않기 때문이다.

 

결론적으로, bk+1도 S의 고유벡터이며, b1,b2,...,bk+1은 모두 직교한다.

 

 

 

 

3. PCA in High Dimensions

실제 데이터의 사례를 보면, 데이터의 개수가 데이터의 차원보다 더 적은 경우가 있다. (N << D)

 

예를 들면, 100 x 100 픽셀의 이미지에서의 D = 10,000 인데, 데이터의 개수 N = 100 인 경우가 있다.

 

 

이런 경우의 PCA는 다음과 같이 구할 수 있다.

 

XTXRD×D를 구하는 것보다

XXTRN×N을 구하는 것이 계산량이 더 적기 때문이다.

 

 


 

 

1. 차원 축소의 방법으로 PCA가 대표적이다.

2. 데이터의 공분산 행렬을 고유값 분해했을 때, 가장 큰 순서대로의 고유값에 해당하는 고유벡터가 주성분이 된다.

LG Aimers에서 KAIST 신진우 교수님 강의를 듣고 정리한 내용입니다.

틀린 부분이 있다면 댓글 부탁드립니다!

 


 

1. Determinant and Trace

(1) Determinant

 

2 x 2 행렬 A에 대해서 역행렬이 존재하는지 알기 위해서 determinant를 구해본다.

determinant가 0이 아니라면 invertible하다.

 

 

2 x 2 행렬에서는 공식처럼 쉽게 역행렬을 구할 수 있다.

더 큰 행렬에 대해서는 Gaussian elimination 방법으로 역행렬을 구한다.

 

 

 

- determinant를 구하는 방법 중 하나로 Laplace expansion (라플라스 전개)가 있다.

 

행 확장이나 열 확장이나 결과는 동일하므로, 더 편한 방법을 사용하면 된다.

 

 

 

(2) determinant theorm

 

rk(A)는 A에 대한 rank (Column space의 차원 수)이다.

 

 

- determinant에 대한 성질은 다음과 같다.

 

determinant는 곱셈에 대해서 분리 가능하다는 점이 특징이다.

또한, (5)에서 삼각행렬에 대한 determinant 공식인데, 이는 당연하게도 대각행렬에서도 성립한다.

 

 

 

(3) Trace (대각합)

행렬의 대각 원소에 대한 합을 의미한다.

 

determinant가 곱셈에 대한 분해가 가능하다는 특징이 있었다면, trace는 덧셈에 대한 분해가 가능하다는 특징이 있다.

 

 

determinant와 trace는 고유값 분해에서 각각 고유값의 곱과 고유값의 합과 같다.

 

 

 

 

2. Eigenvalues and Eigenvectors

(1) 고유값과 고유 벡터

 

특성 방정식에 대한 determinant가 0이어야 한다.

 

그 이유는 적어둔 것과 같이 x가 영벡터가 아니라는 가정에서 특성 방정식이 역행렬을 가지지 않아야지만 해를 가질 수 있기 때문이다.

 

 

예를 들어,

 

이 결과를 통해 eigenvector는 하나만 존재하는 것이 아님을 알 수 있다.

 

 

 

(2) 특징

행렬 A가 n개의 서로 다른 고유값을 가진다면, 고유 벡터들은 linearly independent하다.

 

1. determinant에서 언급한 바와 같이, determinant와 trace는 고유값 분해에서 각각 고유값의 곱과 고유값의 합과 같다.

 

 

 

 

3. Cholesky Decomposition

주어진 행렬이 어떤 작은 행렬 두 개의 곱으로 나타낼 때 사용한다.

 

조건은 Positive-semi definite 행렬이어야 한다는 점이다. 그 기저에는 대칭행렬이라는 조건이 있다.

 

행렬 A에 대해서 숄레스키 분해를 하면 다음과 같고, L을 a 값에 관하여 구할 수 있다.

 

 

 

 

 

4. Eigen-decomposition and Diagonalization

(1) Diagonal Matrix and Diagonalization

대각행렬은 대각선에만 0이 아닌 수가 있고 나머지에는 0을 가지는 행렬이다.

 

이러한 대각행렬은 determinant가 대각선 원소들의 곱과 같고, 행렬의 k승수는 대각원소의 k 승수와 같다.

또한 역행렬은 원소의 역수와 같다.

 

어떤 행렬이 diagonalizable 하다는 것은 행렬이 n개의 선형 독립인 고유벡터를 가진다는 것과 같은 의미이다.

 

Orthogonally diagonalizable 하다는 뜻은 행렬과 전치행렬의 곱이 항등행렬임을 의미하기 때문에, 위와 같이 나타낼 수 있다.

행렬의 고유벡터들로 이루어진 행렬이 직교행렬이며, 모든 대칭행렬은 orthogonally diagonalizable하다.

 

 

 

(2) Power of Diagonalization

 

 

 

 

5. Singular Vector Decomposition

고유값 분해는 정방행렬에서만 가능했다면, 특이값 분해는 고유값 분해가 확장된 방법이다.

 

1) 대칭행렬은 아니지만 정방행렬인 경우

2) 대칭행렬도, 정방행렬도 아닌 경우

 

이때, 행렬의 전치행렬과 행렬의 곱, 행렬과 행렬의 전치행렬의 곱이 정방행렬임을 이용한다.

 

 

특이값 분해를 정리하면 다음과 같다.

 

 


 

 

1. 행렬을 summarize 하는 방법 : determinants, eigenvalues

 

2. 행렬을 분해하는 방법 : Cholesky decomposition, diagonalization, Singular value decomposition

LG Aimers에서 KAIST 차미영 교수님 강의를 듣고 정리한 내용입니다.

틀린 부분이 있다면 댓글 부탁드립니다!

 


 

1. 인공지능과 Creativity

(1) AI도 예술을 창조하는 시대가 도래

- 생성형 AI를 기반으로 그림을 만들고, 작곡을 하기도 한다.

- 실제로 Q&A 시스템에서 인공지능이 인간의 성능을 초월하기도 했다.

[Rajpurkar-Jia-Liang, ACL 2018]

- 2018년 기준이므로 현재는 더 뛰어난 모델이 개발되었을 것이다..

 

 

- 2024년 부천국제판타스틱 영화제에서는 인공지능 영화 부문을 신설하기도 했다.

 

 

 

(2) 저작권 이슈

https://obvious-art.com/portfolio/edmond-de-belamy/

 

- $432,500의 가격에 팔린 인공지능이 만들어낸 작품이다.

- 이때, 학습 데이터, 프로그래머, 기획자 사이에서 저작권 이슈는 빼놓을 수 없다.

- AI 예술 작품은 학습 데이터 기반이기 때문에 '창작성 (originality)'가 있는지 의문이 들기도 한다.

 

- 학습에 사용된 데이터를 제공한 사람에게도 혜택이 돌아가기가 어려운 것이 사실이다.

- 창작자인 AI는 법적 권리르 제공할 수 있는 법적 제도가 부재한 상황이며, 현존하는 예술가들의 스타일을 따라한 경우 상업적 피해를 발생시킨다.

- 또한, 창작된 작품이 인간의 윤리적 규범을 따르지 않을 수도 있다.

 

 

 

(3) 인공지능 법인

- 법인은 법적 권리와 의무에 대한 책임을 소지한다.

- 인공지능은 아직 법인에 속하지 않는다.

 

- '인공지능을 법인으로 인정할 것인가?'에 대한 의논이 벌어지기도 했다.

 

"장기적으로 로봇에 대한 구체적인 법적 지위를 창출하여, 적어도 가장 정교한 자율주행 로봇이 야기할 수 있는 손해를 충분히 배상할 책임이 있는 전자인의 지위를 갖게 하고, 로봇이 자율적인 의사결정을 하거나 그 밖에 독립적으로 제3자와 상호작용하는 경우에 전자인격을 적용할 가능성이 있는 경우"

 

 

- 법인격의 장점으로는 (1) 책임 문제가 쉽게 해결 (2) 혁신, 사회 발전 가능 (3) 법제도가 일관성 있게 유지 (4) 자연인이 아닌 것에 대한 법인이 이미 존재함

- 법인격의 단점으로는 (1) 법적 처벌의 도피로 악용될 가능성 (Liability Shields) (2) 도구주의에 반함 (3) 인류에 대한 수치 (4) 처벌의 어려움

 

 

 

(4) Moral Machine

- 아시모프의 로봇 3원칙이 있다.

- 첫째, 로봇은 인간을 다치게 해선 안 되며, 인간이 해를 입는 걸 방관해서도 안 된다.

- 둘째, 법칙 1에 위배되지 않는 한, 로봇은 인간의 명령에 복종한다.

- 셋째, 법칙 1과 2에 위배되지 않는 한, 로봇은 스스로를 보호해야 한다.

 

 

- 그렇다면 인공지능으로 인한 부작용에 책임 소재는 누구에게 있는지가 문제이다.

- 자율주행 자동차에서 사고가 발생했다면, 소유자, 자동차 회사, AI 개발자, 운전자, 자율주행차, 보행자 중에서 누구에게 법적 책임이 있는 것일까?

https://en.wikipedia.org/wiki/Moral_Machine

 

 

- 알고리즘이 결정을 내릴 때, Moral Machine 설문을 통해 선호도를 측정한다고 한다.

 

http://moralmachine.mit.edu/

 

- 사고의 가능성은 항상 존재하며, 누구를 보호할 것인가에 대한 인공지능의 결정은 여전히 연구 주제이다.

 

 

 

 

2. 세계적인 데이터 과학자가 되는 방법

- 이종 데이터의 결합을 통해 혁신적인 결과를 낸다.

- 예를 들어, 서울시 야간 버스 노선을 제작할 때 통신사와의 협업을 통해 수요를 파악했다고 한다.

 

- Digital Transformation을 통해, 이종 빅데이터의 결합과 새로운 인공지능 기반 계산 과학 방법의 적용이 이뤄진다.

- 이를 통해 데이터 사이언스 기반 난제를 해결하고, 정책을 결정하며 신규 산업을 창출할 수 있을 것으로 기대된다.

 

- 페이스북 스타일로 목표를 설정하는데, 이는 목표가 너무 낮아서 빨리 성취하도록 하는 것을 방지한다. 계속된 목표 수정으로 계속해서 성장해 나가도록 한다.

 

 


 

1. 인간의 창조적 활동 영역으로 들어온 인공지능은 인간의 개입 없이 독자적 창작과 혁신 활동이 가능한 수준으로 발전할 것이라는 전망이 있다.

 

2. AI 시대의 지식 재산, 법인격, 처벌, 윤리 문제 부각은 다양한 계층 시민의 수요와 요구를 논의를 통해 반영해야 한다.

 

3. AI에 대한 경계와 규제의 선택은 인류에 대한 재정의라고 할 수 있다.

LG Aimers에서 KAIST 차미영 교수님 강의를 듣고 정리한 내용입니다.

틀린 부분이 있다면 댓글 부탁드립니다!

 


 

1. 데이터의 시대

(1) 데이터를 잘 해석하고 있는가?

NEJM 2012, “Chocolate Consumption, Cognitive Function, and Nobel Laureates”

 

- '초콜릿을 많이 먹으면 노벨상을 탄다'는 말은 맞는 말일까? 좀 의아하게 들린다. 따라서 데이터를 잘 해석해야 한다.

 

- '상관관계' ≠ '인과관계'

 

 

 

(2) 데이터 전처리와 분석 방법은 적절한가?

 

- 실제로 메타에서는 그래프에서 Error bar가 존재하지 않는다면 아예 데이터를 믿지 않는다고 한다.

- 따라서, (1) Error bar 추가 (2) 적절한 통계 테스트 찾기 (3) Outlier 제거 (4) 데이터 표준화 (5) EDA를 통해 데이터를 충분히 들여다보고 알아나가는 시간이 필요하다.

 

 

 

(3) 학습에 쓰는 데이터가 충분한가?

 

- 일반적으로 인공지능 알고리즘에서 필요한 데이터 양은 보통 million scale (100만 데이터)라고 한다.

 

- 데이터 학습의 결과가 적절한 수준인지에 대한 인식이 있어야 한다. 그림처럼 모델이 너무 단순하거나, 너무 복잡하여 Under-fitting 되거나 Over-fitting 되지 않도록 해야 한다.

 

- 학습 데이터 ≠ 테스트 데이터

 

 

 

2. Black Box Algorithm

(1) 설명력이 중요한 AI

- 인공지능에서는 '성능' 뿐만 아니라, '설명력'도 중요한 요소이다.

- 실제로 면세 범위 초과 물품, 위장 반입, 원산지 조작 등의 세관에서 벌어지는 불법 행위를 적발하는 AI 기술을 개발한 것에 대해 왜 그렇게 판단을 하였는지에 대한 '설명력'이 전문가들을 설득하는 데 중요한 요소로 작용했다고 한다.

 

 

- AI 기반 학습 알고리즘은 결과에 대한 설명이 불가능한 'Black Box Algorithm'이라는 특징을 가지고 있다.

- 앞선 사례처럼 High risk 결정에서는 설명력도 정확도 (성능) 만큼이나 중요하다.

 

- post-hoc explainability (사후 설명력)

예시) Saliency Map (어디에 집중해서 보는가?), SHAP (SHapley Additive exPlanations, 게임 이론을 바탕으로 각 player의 기여분 계산)

 

- 알고리즘의 내면을 가시화하여 보여주는 기술이 개발되고 있다.

 

 

 

(2) 학습 결과가 바뀔 수 있는 위험성

https://hackaday.com/2018/04/15/one-pixel-attack-fools-neural-networks/

 

- One Pixel attack의 예시이다.

- 픽셀 하나만 바뀌었지만 알고리즘 학습 결과가 달라지는, 노이즈에 굉장히 민감한 모델이다.

- 충분히 신뢰성 있는 모델을 개발하도록 해야 한다.

 

 

 

3. Handling the Web data

(1) 의견의 대표성

'Spiral of Silence (침묵의 나선)'

 

https://www.communicationtheory.org/the-spiral-of-silence-theory/

 

- 이는 각 개인들이 '고립'에 대한 공포가 있으며, 고립에 대한 공포는 자신의 의견을 말하는 것보다 침묵을 유지하는 방향으로 이끈다는 것이다.

- 특정 의견이 다수의 사람들에게 지배적인 의견으로 인정되고 있다면, 반대되는 의견을 가지고 있는 소수의 사람들은 침묵하려는 경향이 크다고 한다.

 

- 이러한 현상은 SNS를 통한 빠른 정보 전파, bot의 참여, 극단화 현상 주의를 야기한다. 즉, 정보의 편향을 일으킨다.

 

 

 

(2) 인포데믹 현상

- 오정보의 빠른 확산으로 인한 인포데믹 (infodemic) 현상이 발생한다.

- 사실 정보와 더불어 오정보의 양이 늘어, 구분이 어려워지는 정보 과부하 현상이다.

[Ma et al., IJCAI 2016, Kwon et al., PLoSOne 2017, Bail et al., PNAS 2018, Vosoughiet al., Science 2018, Kimetal.,WSDM2018]

- Facts는 연결되면서 퍼지지만, Rumors는 산발적으로 퍼져나가며 인포데믹 현상을 발생시킨다.

 

 

 

(3) Digital Services Act

- 유럽 연합 중심으로 빅테크 기업 대상 플랫폼 유해 컨텐츠 단속 의무를 강화하고 있으며, 이는 전세계로 확산되고 있다.

- 네티즌의 성별, 인종, 종교 등에 기반한 알고리즘으로 개인화 추천 광고를 노출하지 않도록 하고 있다.

- DSA 위반 시 연매출 대비 상당한 과징금도 부여하고 있다.

 

 

 

3. AI and Ethical Decisions

(1) COMPAS (Correctional Offender Management Profiling for Alternative Sanctions) 

- North pointe, Inc가 개발한 소프트웨어로, 피고의 미래 범죄 위험을 점수로 예측한다.

- 미국 법원의 형사 재판에서 판사들의 의사결정을 지원하기 위해 사용하고 있으며, 현재 캘리포니아주, 뉴욕주, 위스콘신주,  플로리다, 워싱턴 등 12개 기타 관할권 법원에서 사용중이다.

 

 

- 한편, COMPAS가 예측한 미래 범죄 위험도 알고리즘이 인종 차별을 조장하는 사례가 있었다.

 

- 두 사람 모두 사소한 절도로 인해 체포되었다.

- 왼쪽은 무장 강도 등의 전과가 있었고, 오른쪽은 어린 시절 저지른 경범죄의 전과가 있었다. 하지만, 흑인 여성에 대해 COMPAS는 더 높은 범죄 위험도를 부여했다.

- 2년 후, 왼쪽은 절도 혐의로 징역을 살게 되었고, 오른쪽은 이후 범죄를 저지르지 않았다고 한다.

 

- 알고리즘의 '편향성' 때문에 발생한 사례이다.

 

 

 

(2) Microsoft Tay

- 백인 우월주의자, 여성, 무슬림 혐오자들이 차별 발언하도록 학습되어 공개 16시간만에 서비스를 중단했다.

- 이후 MS는 Zo라는 13세 여성 캐릭터 챗봇을 새로 공개했는데, 소수자에 대한 대화 자체를 피하도록 개발되어 컨텐츠 검열이라는 지적을 받기도 했다.

 

 


 

1. 데이터의 확보, 전처리, 분석, 해석의 전 과정이 중요하다. 데이터가 알고리즘의 품질을 결정한다.

 

2. 알고리즘의 설명력, 편향, 신뢰의 문제에 주의한다.

+ Recent posts