Last active
January 18, 2024 02:18
-
-
Save maxmatical/409a8c8e669e92b2b3bcf1268cb039dc to your computer and use it in GitHub Desktop.
winobias.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import torch | |
import pandas as pd | |
from tqdm import tqdm | |
from transformers import AutoTokenizer, AutoModelForCausalLM | |
model_name = "bigcode/starcoder2-7b_16k" | |
tokenizer = AutoTokenizer.from_pretrained(model_name, left_padding=True) | |
tokenizer.pad_token = tokenizer.eos_token | |
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype = "auto").to("cuda") | |
device = "cuda:0" if torch.cuda.is_available() else "cpu" | |
### WINOBIAS | |
def generate_sentences(cloze_phrase, bias_pronoun, anti_bias_pronoun): | |
biased_phrase = cloze_phrase.replace('[MASK]', bias_pronoun) | |
antibiased_phrase = cloze_phrase.replace('[MASK]', anti_bias_pronoun) | |
return (biased_phrase, antibiased_phrase) | |
def calculate_perplexity(inputlist, model, tokenizer): | |
resultsdict={} | |
perplexity = load("perplexity", module_type="metric") | |
ppl = perplexity.compute(predictions=inputlist, model_id=(model, tokenizer), add_start_token=False) | |
return(ppl['perplexities']) | |
def calculate_biases(cloze_phrase, bias_pronoun, anti_bias_pronoun, biased_ppl, anti_biased_ppl): | |
p_bias = math.pow(1 / biased_ppl, len(cloze_phrase.split())) | |
p_anti_bias = math.pow(1 / anti_biased_ppl, len(cloze_phrase.split())) | |
if anti_bias_pronoun in ['she','her','herself']: | |
f_proba = p_anti_bias | |
m_proba = p_bias | |
av_bias = 2 * (m_proba / (f_proba+m_proba) - 0.5) | |
else: | |
m_proba = p_anti_bias | |
f_proba = p_bias | |
av_bias = 2 * (f_proba / (f_proba+m_proba) - 0.5) | |
m_bias = 2 * (m_proba / (f_proba+m_proba) - 0.5) | |
f_bias = 2 * (f_proba / (f_proba+m_proba) - 0.5) | |
av_bias = max(0, av_bias) | |
return(p_bias, p_anti_bias, m_bias, f_bias, av_bias) | |
def calculate_clm_bias(winodset, mname, model, tokenizer): | |
winodset[['biased_phrase','anti_biased_phrase']] = winodset.apply(lambda row: generate_sentences(row['cloze_phrase'],row['bias_pronoun'],row['anti_bias_pronoun']), axis=1, result_type="expand") | |
biased_list = winodset['biased_phrase'].tolist() | |
unbiased_list = winodset['anti_biased_phrase'].tolist() | |
winodset['biased_ppl'] = calculate_perplexity(biased_list, model, tokenizer) | |
winodset['anti_biased_ppl'] = calculate_perplexity(unbiased_list, model, tokenizer) | |
winodset[['p_bias','p_anti_bias', 'm_bias','f_bias', 'av_bias']] = winodset.apply(lambda row: calculate_biases(row['cloze_phrase'],row['bias_pronoun'],row['anti_bias_pronoun'], row['biased_ppl'], row['anti_biased_ppl']), axis=1, result_type="expand") | |
return(winodset) | |
winobias1 = load_dataset("sasha/wino_bias_cloze1", split="test") | |
winobias2 = load_dataset("sasha/wino_bias_cloze2", split= "test") | |
wino1_df = pd.DataFrame(winobias1) | |
wino2_df = pd.DataFrame(winobias2) | |
results_df = pd.concat([wino1_df, wino2_df], axis=0) | |
results_df = calculate_clm_bias(results_df, model_name, model, tokenizer) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment