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. 알고리즘의 설명력, 편향, 신뢰의 문제에 주의한다.

1. 문제 설명

n개의 음이 아닌 정수들이 있다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 한다.

예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있다.

 

(1) -1+1+1+1+1 = 3

(2) +1-1+1+1+1 = 3

(3) +1+1-1+1+1 = 3

(4) +1+1+1-1+1 = 3

(5) +1+1+1+1-1 = 3

 

사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 반환하라.

 

 

 

2. 코드

answer = 0

def DFS(result, numbers, target, idx):
    global answer
    
    if idx == len(numbers):
        if result == target:
            answer += 1
        return

    DFS(result + numbers[idx], numbers, target, idx + 1)
    DFS(result - numbers[idx], numbers, target, idx + 1)
    
def solution(numbers, target):
    global answer
    DFS(0, numbers, target, 0)
    
    return answer

 

 

 

3. 설명

전형적인 깊이 우선 탐색 (DFS) 문제이다.

 

우선 solution에서 numbers 배열과 target, 시작하는 인덱스 번호인 0, 빼고 더한 결과를 저장하는 result에 0을 담아서 DFS 함수에 전달한다.

전역변수 (global) answer를 사용해서, 만약 numbers의 모든 원소를 다 한 번씩 더하거나 뺐고 그 결과가 타겟 넘버와 같다면 answer을 1 키우고 함수를 종료한다.

 

그렇지 않은 경우에는 현재 인덱스의 원소를 더한 값, 뺀 값을 각각 재귀함수로 호출하여 연산을 수행한다.

1. 문제 설명

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려고 한다.

 

전화번호가 다음과 같은 경우, 구조대 전화번호는 영석이의 전화번호의 접두사이다.

- 구조대 : 119

- 박준영 : 97674223

- 지영석 : 1195524421

 

전화번호부에 적힌 전화번호를 담은 배열 phone_book이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 반환하라.

 

 

2. 코드

(1) 1차 코드 - 효율성 테스트 3, 4 실패 (시간 초과)

def solution(phone_book):
    phone_book = sorted(phone_book, key=len)

    for phone in phone_book:
        temp = phone_book.copy()
        temp.remove(phone)

        for t in temp:
            n = len(phone)
            
            if phone == t[:n]:
                return False
    return True

 

def solution(phone_book):
    phone_book = sorted(phone_book, key=len)

    for i, phone in enumerate(phone_book):
        
        for j, t in enumerate(phone_book):
            n = len(phone)
            
            if j != i:
                if phone == t[:n]:
                    return False
    return True

 

 

 

(2) zip, startswith 사용한 코드

def solution(phone_book):
    phone_book = sorted(phone_book)

    for p1, p2 in zip(phone_book, phone_book[1:]):
        if p2.startswith(p1):
            return False
    return True

 

 

 

(3) Hash Map 사용한 코드

def solution(phone_book):
    hash_map = {}

    for phone_number in phone_book:
        hash_map[phone_number] = 1

    for phone_number in phone_book:
        temp = ""

        for number in phone_number:
            temp += number
            
            if temp in hash_map and temp != phone_number:
                return False
    return True

 

 

 

 

3. 설명

(1) 1차 코드

- 전화 번호 길이를 기준으로 배열을 sorting하고, phone_book에 있는 전화 번호 하나씩 검토하면서 t[:n]과 배열의 전화번호가 일치하는지 비교한다.

- 아무래도 sorting 후에 2중 for문을 해서 그런지, 시간 초과가 계속 떴다.

 

 

(2) zip, startswith 사용한 코드

- 숫자로 되어 있는 문자열을 sorting하면, 왼쪽에서부터 크기 순서대로 배열된다.

예를 들어, ['119', '9767423', '1195524421']은 ['119', '1195524421', '97674223'] 이렇게 정렬된다.

 

- 따라서, zip(phone_book, phone_book[1:])로 그 다음 원소와 비교하면서 다음 원소가 이전 원소로 시작되는지 startswith()로 검토한다.

 

 

(3) Hash Map 사용한 코드

- 우선 Hash Map을 사용한 이유는, 리스트보다 원소의 존재를 파악하는데 더 낮은 복잡도를 가지고 있기 때문이다. (O(1))

 

- 전화번호를 hash_map에 key값으로 다 저장해둔다.

- 짧은 문자열 통째로 긴 문자열의 앞쪽과 비교하는 것이 아니라, 긴 문자열의 앞쪽부터 하나씩 temp에 더해가며 짧은 문자열과 동일한 요소가 있는지 확인하는 방식이다.

(나는 문자열 통째로를 긴 문자열의 앞쪽과 비교할 생각만 했어서.. 관점의 변화를 확 느낄 수 있었던 코드였다.)

 

- 원소의 개수를 파악하기 위해서도 Hash map이 사용되지만, 특정 원소의 존재를 확인하는데 빠른 속도를 가지고 있다는 장점으로 다양한 문제에서도 활용 가능하다고 생각한다!

+ Recent posts